1. 程式人生 > >多執行緒學習-----執行緒同步(四)

多執行緒學習-----執行緒同步(四)

兩個執行緒要執行的程式碼片段要實現同步互斥的效果,它們必須用同一個Lock物件,鎖是上在代表要操作的資源類的內部方法中的,而不是線上程程式碼中,

問題:子執行緒迴圈10次,回到主執行緒執行100次,接著又回到子執行緒執行10次,再回到主執行緒執行100次,如此迴圈50次,該如何實現?

public class ThreadCommunicationStudy {
	
	
	public static void main(String[] args) {
		//執行緒程式碼
		Bussiness b = new Bussiness();
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i = 1;i<=50;i++){
					b.subThreadCreate(i);
				}
			}
		}).start();
		
		for(int i = 1;i<=50;i++){
			b.mainThreadCreate(i);
		}
		
	}
	
}
//資源類
class Bussiness{
	//指示是否該子執行緒執行的布林臨時變數
	private boolean isSub = true;
	
	//子執行緒資源方法
	public synchronized void subThreadCreate(int i){
		//如果不該子執行緒執行,子執行緒等待
		while(!isSub){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int j = 1;j<=10;j++){
			System.out.println("sub thread number of "+j+" loop of "+i);
		}
		//子執行緒執行完,讓指示是否該子執行緒執行為false
		isSub = false;
		//喚醒等待的主程序
		this.notify();
	}
	//主執行緒資源方法
	public synchronized void mainThreadCreate(int i){
		//如果該子程序去執行,讓主程序等待
		while(isSub){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int j = 1;j<=100;j++){
			System.out.println("MAIN thread number of "+j+" loop of "+i);
		}
		//主程序執行完,輪到子程序去執行,令isSub為true
		isSub = true;
		//喚醒等待的子程序
		this.notify();
	}
}