子線程循環10次,接着主線程循環100次,接着又回到子線程循環10次,接着再回到主線程又循環100次,如此循環50次,請寫出程序。java
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(); } }
一、Lock比傳統線程模型中的synchronized方式更加面向對象,與生活中的鎖相似,鎖自己也應該是一個對象。兩個線程執行的代碼片斷要實現同步互斥的效果,它們必須用同一個Lock對象。鎖是上在表明要操做的資源的類的內部方法中,而不是線程代碼中!算法
二、使用wait與notify實現線程間(主線程和子線程)的通訊oop
三、關於互斥分組的問題this
須要用到共同數據(包括同步鎖)或共同算法的若干個方法應該歸在同一個類中,這種設計正好體現了高類聚和程序的健壯性。spa