多線程經典問題2——子線程之間交替問題
阿新 • • 發佈:2017-08-16
line read microsoft star 經典問題 推斷 all size lcx
編寫一個程序。開啟3個線程,這3個線程的ID分別為A、B、C,每一個線程將自己的ID在屏幕上打印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。
這個問題仍舊是線程間的交替控制問題,分析方法還是能夠同上一篇“多線程經典問題1——主線程子線程交替問題”。
詳細代碼例如以下:
package treadgame; /** * 線程間的交流1 * 編寫一個程序,開啟3個線程,這3個線程的ID分別為A、B、C, * 每一個線程將自己的ID在屏幕上打印10遍, * 要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。 * @author lcx * */ public class ThreadExchange2 { public static void main(String[] args) { Resource2 res=new Resource2(); Thread td1=new Thread(new Subs('A',res)); Thread td2=new Thread(new Subs('B',res)); Thread td3=new Thread(new Subs('C',res)); td1.start(); td2.start(); td3.start(); } } class Resource2 { int index=0; public synchronized void runSub(char tag) { for(int i=0;i<10;i++) { while(tag-'A'!=index) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(tag); index=(index+1)%3; notifyAll(); } } } class Subs implements Runnable { char tag; Resource2 res; public Subs(char tag,Resource2 res) { this.tag=tag; this.res=res; } public void run() { res.runSub(tag); } }
必需要註意的是
while(tag-'A'!=index)
不能寫成
<pre name="code" class="java">if(tag-'A'!=index)否則會出現錯誤,由於notifyAll會喚醒剩下的兩個線程。當中僅僅能有一個是正確的、需要運行的線程
追問:之前說的子線程與主線程交替運行,為什麽就能夠在使用if來推斷是否wait?
由於假設本線程不是須要運行的線程。那麽另外一個線程絕對是須要運行的線程,所以一個if即可。
多線程經典問題2——子線程之間交替問題