建立子父執行緒 保證一件事情 子執行緒執行三次後 父執行緒執行5次 如此迴圈十次
阿新 • • 發佈:2018-12-13
public class FatherAndSon{ bokean flag=true; public synchronized void father(){ //理當父執行緒不執行 wait():如果在一個執行緒 中呼叫了obj.wait():自己本身進入阻塞狀態 並釋放對鎖的佔有(立即釋放) // notify(): 喚醒執行緒(喚醒的是等待obj鎖的執行緒) 阻塞佇列---->Object的方法 if(flag){ //判斷此時是子執行緒還是父執行緒進行執行,當flag的值是true時,父執行緒執行 try { this.wait(); //當子執行緒進行執行時,通過呼叫wait方法使父執行緒阻塞 } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<5;i++){ //父執行緒迴圈執行5次 System.out.println("父執行緒第"+(i+1)+"次執行"); } flag=true; //轉換flag的值。使父線在執行五次之後進入阻塞狀態,不再執行父執行緒 this.notify(); //通過呼叫notify方法喚醒正在阻塞的執行緒 } //this FatherAndSon son=new FatherAndSon(); 物件是單例的 public synchronized void sub(){ if(!flag){ //判斷flag的值,當flag的值是false時,子執行緒執行 //理當父執行緒不執行 wait():如果在一個執行緒 中呼叫了obj.wait():自己本身進入阻塞狀態並釋放對鎖的佔有(立即釋放) // notify(): 喚醒執行緒(喚醒的是等待obj鎖的執行緒) 阻塞佇列---->Object的方法 try { this.wait(); //呼叫wait方法,使子執行緒進入阻塞狀態不再執行子執行緒 } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<3;i++){ //使子執行緒迴圈執行3次 System.out.println("子執行緒第"+(i+1)+"次執行"); } flag=false; //重新賦予flag的值,使子執行緒在執行3次之後進入阻塞狀態,釋放同步鎖,讓父執行緒進行執行 this.notify(); //呼叫notify方法喚醒阻塞中的執行緒 } } public static void main(String[] args) { final FatherAndSon fs=new FatherAndSon(); //建立物件呼叫方法 new Thread(new Runnable() { //JVM叫本地方法棧 @Override public void run() { //子執行緒的執行緒體 for (int i=0;i<10;i++) fs.sub(); } }).start(); //父執行緒的執行緒體 for(int i=0;i<10;i++) fs.father(); } }