1. 程式人生 > 其它 >等待喚醒案例、wait方法和notifyAll方法

等待喚醒案例、wait方法和notifyAll方法

等待喚醒案例程式碼實現

package Text2;
public class demo6WaitAndNotify {
    public static void main(String[] args) {
        //建立鎖物件,保證唯一
        Object obj=new Object();
        //建立一個顧客執行緒
        new Thread(){
            @Override
            public void run() {
                //保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
                synchronized
(obj) { System.out.println("告訴老闆要的包子的種類和個數"); //呼叫wait方法,放棄cpu的執行,進入waiting狀態 try { obj.wait(5000); } catch (InterruptedException e) { e.printStackTrace(); }
//喚醒之後執行的程式碼 System.out.println("包子做好了,開吃!"); } } }.start(); //建立一個老闆執行緒 new Thread(){ @Override public void run() { //花5秒做包子 try { Thread.
sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術 synchronized (obj){ System.out.println("做好後,告知顧客包子做好了"); //包子做好後,呼叫notify方法,喚醒顧客吃包子 obj.notify(); } } }.start(); } }

Object類中wait帶引數方法和notifyAll方法

在這裡插入圖片描述

package Text2;
public class demo6WaitAndNotify {
    public static void main(String[] args) {
        //建立鎖物件,保證唯一
        Object obj=new Object();
        //建立一個顧客執行緒
        new Thread(){
            @Override
            public void run() {
                //保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
                    synchronized (obj) {
                        System.out.println("告訴老闆要的包子的種類和個數");
                        //呼叫wait方法,放棄cpu的執行,進入waiting狀態
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //喚醒之後執行的程式碼
                        System.out.println("包子做好了,顧客1開吃!");
                    }
                }

        }.start();
        new Thread(){
            @Override
            public void run() {
                    //保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
                    synchronized (obj) {
                        System.out.println("告訴老闆要的包子的種類和個數");

                        //呼叫wait方法,放棄cpu的執行,進入waiting狀態
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //喚醒之後執行的程式碼
                        System.out.println("包子做好了,顧客2開吃!");
                    }
            }
        }.start();
        //建立一個老闆執行緒
        new Thread(){
            @Override
            public void run() {
                //花5秒做包子
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
                synchronized (obj){
                    System.out.println("做好後,告知顧客包子做好了");
                    //包子做好後,呼叫notify方法,喚醒顧客吃包子
                    obj.notifyAll();
                }
            }
        }.start();
    }
}

notifyAll()喚醒在此物件監視器上等待的所有執行緒
notify()喚醒在此物件監視器上等待的單個執行緒