1、概述:C#支持多线程并行执行程序,一个线程有他单独的执行路径,能够与其他线程同时执行,一个程序是由一个单线程开始,该单线程由CLR(公共语言运行时)和操作系统创建而成,并具有多线程创建额外线程的功能。
(1)、主线程和子线程分别执行不同的任务
using System; using System.Threading; namespace MuliThreading { class Thread1 { static void Main(string[] args) { Thread t = new Thread(writeY); //为该类传入一个方法(委托) t.Start(); while (true) Console.Write("x"); } static void writeY() { while (true) Console.Write("y"); } //代码解读:主线程创建了一个新线程t,t传入的是writeY方法,重复打印y,同时主线程打印x,主线程和新线程同时执行 } }
输出结果:
无限输出x和y;
(2)主线程和子线程分别执行相同的任务
using System; using System.Threading; namespace Mulithreading { class Thread2 { static void Main(string[] args) { new Thread(Go).Start(); Go(); } static void Go() { for (int i = 0; i < 5; i++) { Console.Write("?"); } } //代码解读:在主线程中创建了一个子线程,主线程和子线程同时执行Go() } }
输出:
(3)主线程和子线程使用同一目标的公共实例
using System; using System.Threading; namespace Mulithreading { class Thread3 { bool done; static void Main(string[] args) { Thread3 t3 = new Thread3(); Thread t = new Thread(t3.Go); t.Start(); t3.Go(); } void Go() { if (!done) { done = true; Console.Write("done"); } } //代码解读:主线程Main()方法和在其中定义的子线程所调用的GO()方法共享以一个公共属性done,当吊用子线程时,对done的修改会影响到主线程的使用,因为两个线程在理论上讲是同时执行,但是实际上不可能精确的同时执行,所以当主线程吊用Go()方法是done为true } }
输出:done
(4)主线程和子线程使用同一目标属性可能会出现的问题
using System; using System.Threading; namespace Mulithreading { class Thread4 { bool done; static void Main(string[] args) { Thread4 t4 = new Thread4(); new Thread(t4.Go).Start(); t4.Go(); } void Go() { if (!done) { Console.Write("done"); done = true; } } //代码解读:当在主线程中吊用子线程时,注意两个线程是同时进行的,所以当子线程吊用Go()方法并执行时,主线程也同时进行吊用执行,两个线程是并行的,所以他们同时输出了done } }
输出:done done
时间: 2024-10-06 18:10:12