最近需要解決乙個多執行緒問題,將這個問題抽象說來就是這個情況。
有a b兩個方法同時完成f工作,a b操作均比較耗時,且 b操作需要a操作完成後才能執行。
現 要 a 和b同時執行n個執行緒。
用數學化的語言描述一下
/***************************
* 現有執行緒 a1,a2……ai……ak
* 執行緒b1,b2,b3……bi……bk
* ai和bi需要順序執行,共同完成f操作
* ai和bi+1之間無干擾
* bi和bi+1之間無干擾
* ai和bi+1之間無干擾
* a b操作都比較耗時
************************/
最初在思考解決方案的時候,想的是 為每一a設定乙個標記位,去記錄 當前的ai所處的狀態,然後再bi中去迴圈訪問ai的該標記,如果標記表示可執行bi,則跳出迴圈,執行bi操作。
想來這種方案應該也能實現,但又想到c#提供的join方法,剛好就是解決t2執行緒執行前需要等待t1完成的問題而給出的,恰好可以利用,處理起來應該會更簡單,更安全。
join方法是指將指定的執行緒合併到當前執行緒中,最初學的時候很不清楚這個合併是什麼意思,現在看來應該就是 類似與在 原有的t2一塊木板(當前執行緒)上的某個位置出 拼上 t1木板(指定執行緒),這樣,執行t2木板是,合併上的t1那一塊也就成為了必經的路程。
join方法還提供了join的時間,以免 t1操作過久,導致一直等待下去。如 t2.join(100);
考慮上面的問題,由於 ai和bi 之間才有同步關係,所以 需要處理就是這乙個對應,join的時候只要找到bi對應的ai執行緒即可
故,我為在整個類中儲存兩個了靜態的 字典 dictionary前乙個 表示該執行緒的索引,=後乙個表示該執行緒本身
源**如下:
1 2
public
class
aibithread
3 18
19 //
建立多個b執行緒
20 for
(inti=
0;i<20;
i++)
21 26
console
.readline()
;27
}28
29 public
voida(
objecti)
30 36
37 public
voidb(
objecti)
38 49 }
然後再main中呼叫start方法,整個模擬完畢,輸出結果如下:
進入執行緒a--0
進入執行緒a--1
執行緒a--1正在執行
進入執行緒a--2
執行緒a--2正在執行
進入執行緒a--3
執行緒a--3正在執行
進入執行緒a--4
執行緒a--4正在執行
執行緒a--0正在執行
進入執行緒a--5
執行緒a--5正在執行
進入執行緒a--6
執行緒a--6正在執行
進入執行緒a--7
執行緒a--7正在執行
進入執行緒a--8
執行緒a--8正在執行
進入執行緒a--9
執行緒a--9正在執行
進入執行緒a--10
執行緒a--10正在執行
進入執行緒a--11
執行緒a--11正在執行
進入執行緒a--12
執行緒a--12正在執行
進入執行緒a--13
執行緒a--13正在執行
進入執行緒a--14
執行緒a--14正在執行
進入執行緒a--15
執行緒a--15正在執行
進入執行緒a--16
執行緒a--16正在執行
進入執行緒a--17
執行緒a--17正在執行
進入執行緒a--18
執行緒a--18正在執行
進入執行緒a--19
執行緒a--19正在執行
進入執行緒b--0
正在等待執行緒a--0
進入執行緒b--1
正在等待執行緒a--1
進入執行緒b--2
正在等待執行緒a--2
進入執行緒b--3
正在等待執行緒a--3
進入執行緒b--4
正在等待執行緒a--4
進入執行緒b--5
正在等待執行緒a--5
進入執行緒b--6
正在等待執行緒a--6
進入執行緒b--7
進入執行緒b--8
正在等待執行緒a--8
正在等待執行緒a--7
進入執行緒b--9
正在等待執行緒a--9
進入執行緒b--10
正在等待執行緒a--10
進入執行緒b--12
正在等待執行緒a--12
進入執行緒b--11
進入執行緒b--13
正在等待執行緒a--13
進入執行緒b--15
正在等待執行緒a--15
進入執行緒b--14
正在等待執行緒a--14
進入執行緒b--16
正在等待執行緒a--11
正在等待執行緒a--16
進入執行緒b--18
正在等待執行緒a--18
進入執行緒b--17
進入執行緒b--19
正在等待執行緒a--17
正在等待執行緒a--19
執行緒a--2要結束了
等待執行緒a--2等待完畢!!
執行緒b--2繼續執行
執行緒a--1要結束了
執行緒a--0要結束了
執行緒a--8要結束了
執行緒a--10要結束了
執行緒a--4要結束了
執行緒a--11要結束了
執行緒a--6要結束了
等待執行緒a--0等待完畢!!
等待執行緒a--8等待完畢!!
執行緒a--12要結束了
等待執行緒a--10等待完畢!!
等待執行緒a--4等待完畢!!
執行緒a--14要結束了
執行緒a--3要結束了
執行緒a--7要結束了
執行緒a--5要結束了
等待執行緒a--1等待完畢!!
執行緒a--9要結束了
執行緒a--13要結束了
執行緒a--15要結束了
執行緒a--17要結束了
等待執行緒a--11等待完畢!!
執行緒a--16要結束了
等待執行緒a--6等待完畢!!
執行緒b--0繼續執行
執行緒a--18要結束了
執行緒b--8繼續執行
等待執行緒a--12等待完畢!!
執行緒b--10繼續執行
執行緒b--4繼續執行
等待執行緒a--14等待完畢!!
執行緒a--19要結束了
等待執行緒a--3等待完畢!!
等待執行緒a--7等待完畢!!
等待執行緒a--5等待完畢!!
執行緒b--1繼續執行
等待執行緒a--9等待完畢!!
執行緒b--11繼續執行
等待執行緒a--13等待完畢!!
等待執行緒a--15等待完畢!!
等待執行緒a--17等待完畢!!
等待執行緒a--16等待完畢!!
執行緒b--6繼續執行
等待執行緒a--18等待完畢!!
執行緒b--2要結束了
執行緒b--12繼續執行
執行緒b--14繼續執行
等待執行緒a--19等待完畢!!
執行緒b--3繼續執行
執行緒b--7繼續執行
執行緒b--5繼續執行
執行緒b--9繼續執行
執行緒b--13繼續執行
執行緒b--15繼續執行
執行緒b--17繼續執行
執行緒b--16繼續執行
執行緒b--18繼續執行
執行緒b--19繼續執行
執行緒b--0要結束了
執行緒b--8要結束了
執行緒b--10要結束了
執行緒b--4要結束了
執行緒b--1要結束了
執行緒b--11要結束了
執行緒b--6要結束了
執行緒b--12要結束了
執行緒b--14要結束了
執行緒b--3要結束了
執行緒b--7要結束了
執行緒b--5要結束了
執行緒b--9要結束了
執行緒b--13要結束了
執行緒b--17要結束了
執行緒b--15要結束了
執行緒b--19要結束了
執行緒b--16要結束了
執行緒b--18要結束了
驗證 原來提出的要求
1. ai和bi需要順序執行
檢視a2和b2的執行過程情況 依次是
進入執行緒a—2 執行緒a--2正在執行 進入執行緒b—2 正在等待執行緒a—2 執行緒a--2要結束了 等待執行緒a--2等待完畢!! 執行緒b--2繼續執行 執行緒b--2要結束了
驗證通過
2. ai 和bi+1 無干擾
檢視 a4 和b 5 狀態,二者之間無干擾
3.ai 和ai+1無干擾,檢視 a9 和a 8 狀態
4.bi 和bi+1無干擾,檢視 b9 和b 8 狀態
備註 :(其實嚴格說來 2,3,4 通過這一組資料是得不出這樣的結果的,應該是多組資料進行觀察。上述234結論只能說是理論分析得來。)
原問題順利解決。
執行緒中的join的問題就暫時說到這裡。
執行緒中的join 方法
作用 join 方法的作用就是讓主線程等待子執行緒執行結束之後再執行主線程。public class father catch interruptedexception e static class son extends thread override public void run system...
執行緒中的join 方法
作用 join 方法的作用就是讓主線程等待子執行緒執行結束之後再執行主線程。public class father catch interruptedexception e static class son extends thread override public void run system...
C 執行緒的Join方法
在.net中,join方法主要是用來阻塞呼叫執行緒,直到某個執行緒終止或經過了指定時間為止。join方法的宣告如下 public void join public bool join int millisecondstimeout public bool join timespan timeout ...