1. 程式人生 > >Java中等待喚醒機制

Java中等待喚醒機制

使用的是繼承自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();
        
    
}