線程狀態
- 初始化狀態
- 就緒狀態
- 運行狀態
- 死亡狀態
- 阻塞狀態
- 超時等待
- 等待狀態
1.1 初始化狀態
通過實現Runnable接口,new出來實例,線程進入初始化狀態
1.2 就緒狀態
初始化狀態調用start()方法,程序進入了就緒狀態。
①調用start(),sleep()結束,join()方法結束,調用yield()方法。
②某個線程拿到對象鎖,鎖池里的對象拿到對象鎖。
③當前時間片用完。
1.3 運行狀態
線程搶占到CPU資源。
1.4 死亡狀態
線程正常執行完、調用stop()方法、拋出異常或ERROR。
1.5 阻塞狀態
發生I/O輸入,進入同步代碼塊
1.6 超時等待
執行Thread.sleep()方法,此方法是Thread內的方法,會拋出異常。
1.7 等待狀態
調用Object里的wait()方法。
| 比較點 | wait() | sleep() |
| 所屬類 | Thread | Object |
| 控制資源 | 釋放資源,讓出CPU | 不釋放資源,僅僅讓出CPU |
| 方法結束時刻 | 調用notify()或notifyAll() | 超時時間到 |
| 調用方法后線程狀態 | 線程釋放對象鎖,進入等待鎖池 | 指定時間不運行 |
| 方法調用結束后 | 等待notify()、或者notifyAll()同步方法執行完拿到鎖, 進入就緒狀態 |
方法調用結束,進入就緒狀態 |
1.7 線程狀態的切換

線程狀態切換中的方法說明
- start():調用start()方法會使得該線程開始執行,正確啟動線程的方式。
- wait():調用wait()方法,進入等待狀態,釋放資源,讓出CPU。需要在同步快中調用。
- sleep():調用sleep()方法,進入超時等待,不釋放資源,讓出CPU
- stop():調用sleep()方法,線程停止,線程不安全,不釋放鎖導致死鎖,過時。
- join():調用sleep()方法,線程是同步,它可以使得線程之間的並行執行變為串行執行。
- yield():暫停當前正在執行的線程對象,並執行其他線程,讓出CPU資源可能立刻獲得資源執行。
yield()的目的是讓相同優先級的線程之間能適當的輪轉執行
- notify():在鎖池隨機喚醒一個線程。需要在同步快中調用。
- nnotifyAll():喚醒鎖池里所有的線程。需要在同步快中調用。
線程狀態方法測試
/**
* 測試yield()
*/
public class TestYield {
public static void main(String[] args) {
MyThread t1 = new MyThread("t1");
MyThread t2 = new MyThread("t2");
t1.start();
t2.start();
}
}
class MyThread extends Thread {
MyThread(String s) {
super(s);
}
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(getName() + ":" + i);
if (i == 0)
yield();
}
}
}
t1:1
t2:1 ---t2執行
t1:2
t1:3
t1:4
t2:2
join()問題連接
/** * 測試join() */ public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTest("t1"); ThreadJoinTest t2 = new ThreadJoinTest("t2"); t1.start(); t1.join(); t2.start(); } } class ThreadJoinTest extends Thread{ public ThreadJoinTest(String name){ super(name); } @Override public void run(){ for(int i=0;i<10;i++){ System.out.println(this.getName() + ":" + i); } } } t1:9 t2:0 --t1執行完,t2才執行 t2:1 t2:2 t2:3 t2:4
join()可以帶參數:join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即join(0)等價於join()。
join()必須在start()后,這樣才能同步。
