閑話不多說,直接看代碼:
var c = new Counter();
//new了3個線程 var t1 = new Thread(() => TestCounter(c)); var t2 = new Thread(() => TestCounter(c)); var t3 = new Thread(() => TestCounter(c));
第一種情況:
//3個線程同時執行(注意這里了3個Start,說明3個線程都已經開始干活)這時主線程會等待3個線程執行完畢,主線程再執行(不一定是誰先完事,所以都要加上join方法) t1.Start(); t2.Start(); t3.Start(); //3個線程都開始執行 t1.Join();//讓主線程等待t1 t2.Join();//讓主線程等待t2 t3.Join();//讓主線程等待t3 //可不可以只寫t3.Join(),去掉其他兩個join呢??????**************不可以,因為是多線程,並不一定是t3最后執行完畢的,所以3個線程都要寫Join(),運行完就讓主線程繼續等下一個。
//Thread.Sleep(xxx); //有的人可能會說,我可不可以不寫join,在這個地方寫個Thread.Sleep(xxx);呢,答案是也不行,Sleep里面的數字寫多少合適呢?少了的話,上面的線程不一定執行的完,寫多了又白白浪費時間。 //第二種情況: //實際相當於單線程的執行效率(3個線程,依次執行) t1.Start();//線程t1開始執行 t1.Join();//主線程等待t1(t2、t3都停止執行) t2.Start();//線程t2開始執行 t2.Join();//主線程等待t2執行完畢(下面t3停止執行) t3.Start();//線程t3開始執行 t3.Join();//主線程等待t3執行完畢
如果完全不寫join語句可以嗎?
1.如果主線程什么都不做了,可能沒有問題
2.如果主線程接下來需要調用子線程的執行結果,如果不寫join語句(那么主線程就不會等待上邊的子線程執行完畢)而繼續執行下面的操作,此時主線程取得並使用的數據就很有可能是子線程執行了一部分的數據(半成品)啊。
所以join的作用就是主線程等待子線程執行完畢了,把活干完了,主線程才能拿着子線程執行完后的完整數據去繼續執行(干活)。