多執行緒學習-----執行緒同步(四)
阿新 • • 發佈:2018-11-03
兩個執行緒要執行的程式碼片段要實現同步互斥的效果,它們必須用同一個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(); } }