多线程小结(3)
【多线程-Join()方法】
一. 什么时候使用Join()方法:
当一个线程操作需要等待另一个线程执行完毕之后才能继续进行时,使用Join()方法。Join方法会等到使用该方法的线程结束后再执行下面的代码。
就是当A线程,要等到B线程完成之后再执行A的话,就用到Join方法了。
因为是得等到B线程先执行,所以是:B.Join();(Join是啥事都依着自己,自己先咋桌咋桌,别人等着他==>凑不要脸;那个Suspend这是你们先跑吧,我不跟你们争==>当代雷锋)
1 namespace ThreadJoin 2 { 3 class Program 4 { 5 private static Thread subthread; 6 private static string name = ""; 7 static void Main(string[] args) 8 { 9 Console.WriteLine("xxxxxx:"); 10 //声明一个新的线程,这里新的线程去执行Getshow的方法 11 //说一点哈:这个声明一个方法,逐步执行的话,他不会进GetShow方法里面,直接跳过 12 subthread = new Thread(new ThreadStart(GetShow)); 13 Console.WriteLine("xxxxxx:"); 14 subthread.Start(); //开启线程 15 subthread.Join();//等待>当subthread线程执行完毕之后,才执行下面的语句 16 // Console.WriteLine();这样的代码,是主线程的代码 17 //本来执行过 subthread.Join(); 后要执行下面的console的,但是现在因为加入了Join 18 //所以得先去执行GetShow方法了。 19 Console.WriteLine("xxxxxx:"); 20 Console.WriteLine("姓名:" + name); 21 22 Console.WriteLine("主线程"); 23 24 25 Console.ReadKey(); 26 27 } 28 static void GetShow() 29 { 30 Console.WriteLine("输入姓名:"); 31 32 name = Console.ReadLine(); 33 Console.WriteLine("次线程"); 34 } 35 } 36 }
Join()方法可以用于简单线程项目的线程同步。
简单的理解,结识:假如有多个线程:但是我想先让B线程跑,B跑完后,其他的再跑;
那就给B:B.Join();
【多线程-Suspend()和Resume()方法】还是没有吃透彻呢
Suspend()用于挂起线程,Resume()用于继续执行已经挂起的线程。
(感觉和Join有点差不多:Join是啥事都依着自己,自己先咋桌咋桌,别人等着他==>凑不要脸;这个Suspend这是你们先跑吧,我不跟你们争==>当代雷锋。)
可以使用这两个方法进行线程的同步,和Start()方法有些类似的是:在调用Suspend方法后不会立即的停止,而是执行到一个安全点后挂起。//这个安全点还没有Get到呢
意思就是,调用Suspend方法后,先让一个正在跑的进程停下来,其他的先跑;继续让他跑就是Resume这个方法。
在开启子线程后立即让他挂起,直到执行了Resume()后恢复线程的执行。
1 namespace ThreadJoin 2 { 3 class Program 4 { 5 private static Thread subthread; 6 private static string name = ""; 7 static void Main(string[] args) 8 { 9 subthread = new Thread(new ThreadStart(GetShow)); 10 subthread.IsBackground = false; 11 subthread.Name = "子线程"; 12 subthread.Start(); //开启线程 13 subthread.Suspend(); //挂起 14 Console.WriteLine(subthread.Name + "挂起"); 15 string name= Thread.CurrentThread.Name; 16 Console.WriteLine("当前线程的名字{0},后台线程:{1}", name, Thread.CurrentThread.IsBackground + ",结束"); 17 subthread.Resume(); //执行 18 Console.WriteLine("主线程结束"); 19 Console.ReadKey(); 20 } 21 static void GetShow() 22 { 23 Console.WriteLine("输入姓名:"); 24 name = Console.ReadLine(); 25 Console.WriteLine("执行"); 26 } 27 } 28 }
在开启子线程后立即让他挂起,直到执行了Resume()后恢复线程的执行。注意如果在线程没有挂起时去调用Resume()方法会出现异常,所有使用这样的方法进行线程线程同步已经不推荐使用了。F12查看该方法看到已经进行了Obsolete进行了标记。
线程的同步可以使用互斥体(Mutex)和信号量(Signaling)进行。