多线程小结(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 }
View Code

 

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 }
View Code

 

 

 在开启子线程后立即让他挂起,直到执行了Resume()后恢复线程的执行。注意如果在线程没有挂起时去调用Resume()方法会出现异常,所有使用这样的方法进行线程线程同步已经不推荐使用了。F12查看该方法看到已经进行了Obsolete进行了标记。

线程的同步可以使用互斥体(Mutex)和信号量(Signaling)进行。

 

posted @ 2018-05-13 22:31  ProZkb  阅读(207)  评论(0编辑  收藏  举报