線程的等待狀態


6種線程狀態:

  NEW:至今尚未啟動的線程
  RUNNABLE:正在 java 虛擬機中執行的線程
  BLOCKER:受阻塞並等待某個監視器鎖的線程
  TIMED_WAITING:在指定的等待時間內都是處於休眠的狀態
  WAITING:無限期地休眠
  TERMINATED:已退出的線程

定義: Waiting狀態在API中的介紹為:一個正在無限期等待另一個線程執行喚醒動作的線程。這里其實涉及了關於線程間通信的知識——等待喚醒機制。
比如
創建一個顧客線程(消費者):告知老板要的燒烤的種類和數量,調用wait()方法,放棄使用cpu的執行,進入到WAITING狀態(無限等待)
創建一個老板線程(生產者):花了5秒做燒烤,做好燒烤之后,調用notify()方法,喚醒顧客吃燒烤
注意:
顧客和老板線程必須使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行
同步使用的鎖對象必須保證唯一
只有鎖對象才能調用wait和notify方法
Object類中的方法
  void wait():在其它線程調用 此對象的notify()方法或notifyAll()方法前,導致當前線程等待
  void wait(long miles):有參數的話,就是計時等待,時間一到,不用喚醒也能自動醒來,跳到RUNNABLE或BLOCKED狀態
  void notify(): 喚醒在此對象監視器上等待的單個線程,如果有多個線程,會隨機喚醒一個
  void notifyAll():喚醒在此對象監視器上等待的所有線程

下面直接看看一個測試的代碼類:
package com.shopping.test;

public class WaitAndNotify {
    public static void main(String[] args) {
        //創建鎖對象,保證唯一
        final Object obj = new Object();
        //創建一個顧客線程
        new Thread() {
            public void run() {
                //保證等待和喚醒的線程只能有一個執行,需要使用同步技術
                synchronized (obj) {
                    System.out.println("顧客:告知老板要的燒烤的種類和數量");
                    //調用wait方法,放棄CPU的執行,進入到WAITING無限等待狀態
                    try {
                        //編譯期異常,但是不能用throws聲明,因為父類的run方法沒有拋異常聲明,子類也不能
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //被喚醒之后的代碼
                    System.out.println("顧客:開吃");
                }
            }
        }.start();

        //創建一個老板線程(生產者)
        new Thread() {
            public void run() {
                //老板花了5秒鍾做燒烤
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj) {
                    //燒烤已經做好,喚醒顧客吃燒烤
                    System.out.println("老板:燒烤已經做好了");
                    //調用notify()方法,喚醒顧客線程
                    obj.notify();
                }
            }
        }.start();
    }

    //說明:剛開始老板線程一直在睡,那肯定是顧客線程先進入到同步代碼塊,顧客線程先開始執行

  

}
輸出:
    顧客:告知老板要的燒烤的種類和數量
    老板:燒烤已經做好了
    顧客:開吃
 這是直接在測試類中測試的,具體的項目要按照具有的情況進行執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM