1. 程式人生 > >多線程經典問題2——子線程之間交替問題

多線程經典問題2——子線程之間交替問題

line read microsoft star 經典問題 推斷 all size lcx

編寫一個程序。開啟3個線程,這3個線程的ID分別為ABC,每一個線程將自己的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——子線程之間交替問題