傳統線程同步通訊技術

      子線程循環10次,接着主線程循環100次,接着又回到子線程循環10次,接着再回到主線程又循環100次,如此循環50次,請寫出程序。java

1、代碼實現

public class TraditionalThreadCommunication {
	public static void main(String[] args) {
		final Business business = new Business();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i = 1; i <= 50; i++){
					try {
						business.sub(i);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
		
		for(int i = 1; i <= 50; i++){
			try {
				business.main(i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

//將具備相似功能的業務代碼抽象到同一個類中
//下面兩個方法(sub/main)是互斥的,均是獨立的一個同步模塊,處於同一個互斥組(經過synchronized代表均屬於同一個類,同一時刻只能有一個線程持有該鎖)
class Business{
	//主線程和子線程切換執行的一個標識
	boolean flag = true;
	
	synchronized void sub(int i) throws InterruptedException{
//		if(!flag){
		//循環和if功能相仿,但更加完備
		while(!flag){
			//使當前線程等待...
			this.wait();
		}
		
		for(int j = 1; j <= 10; j++){
			System.out.println("sub thread sequence of "  + j + ", loop of " + i);
		}
		
		flag = false;
		
		//喚醒其它正在等待的線程
		this.notify();
	}
	
	synchronized void main(int i) throws InterruptedException{
//		if(flag){
		//循環和if功能相仿,但更加完備
		while(flag){
			//使當前線程等待...
			this.wait();
		}
		
		for(int j = 1; j <= 100; j++){
			System.out.println("main thread sequence of "  + j + ", loop of " + i);
		}
		
		flag = true;
		
		//喚醒其它正在等待的線程
		this.notify();
	}
}

2、注意

      一、Lock比傳統線程模型中的synchronized方式更加面向對象,與生活中的鎖相似,鎖自己也應該是一個對象。兩個線程執行的代碼片斷要實現同步互斥的效果,它們必須用同一個Lock對象。鎖是上在表明要操做的資源的類的內部方法中,而不是線程代碼中!算法

    二、使用wait與notify實現線程間(主線程和子線程)的通訊oop

    三、關於互斥分組的問題this

3、總結

       須要用到共同數據(包括同步鎖)或共同算法的若干個方法應該歸在同一個類中,這種設計正好體現了高類聚和程序的健壯性。spa

相關文章
相關標籤/搜索