Java中等待喚醒機制
阿新 • • 發佈:2019-01-02
使用的是繼承自Object的兩個方法
public final void wait() throws InterruptedException執行緒等待
public final void notify()
喚醒在此物件監視器上等待的單個執行緒
自定義類,定義資訊
public class People {
String name ;
int age ;
boolean flag; //預設沒有資料,如果是true,說明有資料
}
設定資料
public void run() { //設定學生資料 while(true) { synchronized (s) { //判斷有沒有資料的情況 if(s.flag) { try { s.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(x%2 ==0) { s.name = "1" ; s.age = 20 ; }else { s.name = "2"; s.age = 30 ; } x++ ; //如果有資料了,更改flag值 s.flag = true ;//有資料了 //通知t2執行緒消費資料,喚醒 s.notify(); //喚醒t2執行緒,喚醒之後t1,t2都互相搶佔 } } }
輸出資料
public void run() { //輸出該學生資料 while(true) { synchronized (s) { //如果本身消費者有資料 if(!s.flag) { try { s.wait();//和網路程式設計中TCP程式設計裡面的accept() 都屬於阻塞式方法 //消費執行緒等待,等待該執行緒先輸出這些資料(立即釋放鎖物件) } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(s.name +"----"+s.age);//輸出名字和年齡 //如果沒有資料類, s.flag = false ; //通知t1執行緒,趕緊產生資料 s.notify(); //喚醒單個執行緒 } } }
主函式
public static void main(String[] args) { //針對同一個物件進行操作 People s = new People() ; //建立執行緒類物件 SetThread st = new SetThread(s) ;//public Thread(Runnable target)分配新的 Thread 物件 GetThread gt = new GetThread(s) ; //建立執行緒了物件 Thread t1 = new Thread(st) ; //生產者 Thread t2 = new Thread(gt) ;//消費者 //啟動執行緒 t1.start(); t2.start(); }