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(); } //說明:剛開始老板線程一直在睡,那肯定是顧客線程先進入到同步代碼塊,顧客線程先開始執行 }
輸出:
顧客:告知老板要的燒烤的種類和數量
老板:燒烤已經做好了
顧客:開吃
這是直接在測試類中測試的,具體的項目要按照具有的情況進行執行
