一、線程的6個狀態
- New(新創建)
使用new Thread()新創建但還沒啓動的線程。 - Runnable(可運行和運行中)
調用start()方法後線程即處於Runnable()狀態,無論線程是夠真正獲取到了資源真正的運行。
即使調用了start()方法後因爲系統沒有資源,線程狀態依然是runnable。 - Blocked(被阻塞)
當線程運行到synchronized代碼塊時,並且該鎖被其他線程拿走了,這個線程的狀態就是blocked。 - Waiting(等待)
調用了Object.wait()、Thread.join()、LockSupport.park()方法後,線程進入wait狀態,可提前喚醒。 - Timed Waiting(計時等待)
調用了Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)、LockSupport.parkUntil(time)方法後,線程進入timed waiting狀態。
可以看做有等待時間期限的wait狀態,可提前喚醒。 - Terminated(終止)
run()方法執行結束了,或者拋出異常導致run()方法終止,線程進入terminated狀態。
二、線程的狀態演示
1.New、Runnable、Terminated
/**
* 展示線程的New、Runnable、Terminated狀態
*/
public class ThreadStatus {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new DoWork());
System.out.println("執行new Thread()後子線程的狀態:"+thread.getState());
thread.start();
System.out.println("執行Thread.start()後子線程的狀態:"+thread.getState());
Thread.sleep(1);
System.out.println("執行run()時子線程的狀態:"+thread.getState());
Thread.sleep(100);
System.out.println("執行完run()時子線程的狀態:"+thread.getState());
}
}
class DoWork implements Runnable{
@Override
public void run() {
for (int i=0; i<10000; i++){
if(i%100==0){
System.out.println(i);
}
}
}
}
2.Blocked、TimedWaiting
/**
* 展示線程的Blocked、TimedWaiting狀態
*/
public class ThreadStatus {
public static void main(String[] args) throws InterruptedException {
DoWork doWork = new DoWork();
Thread thread1 = new Thread(doWork);
Thread thread2 = new Thread(doWork);
thread1.start();
thread2.start();
Thread.sleep(1000);
System.out.println("thread1進入syn(),等待3s,狀態:"+thread1.getState());
System.out.println("thread2沒有syn()的鎖,阻塞,狀態:"+thread2.getState());
}
}
class DoWork implements Runnable{
@Override
public void run() {
syn();
}
// 只能有一個線程進入,其餘想進入的線程阻塞
private synchronized void syn(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.Waiting
/**
* 展示線程的Waiting狀態
*/
public class ThreadStatus {
public static void main(String[] args) throws InterruptedException {
DoWork doWork = new DoWork();
Thread thread1 = new Thread(doWork);
thread1.start();
Thread.sleep(3100);
System.out.println("thread1執行了wait(),狀態:"+thread1.getState());
}
}
class DoWork implements Runnable{
@Override
public void run() {
syn();
}
// 只能有一個線程進入,其餘想進入的線程阻塞
private synchronized void syn(){
try {
Thread.sleep(3000);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
三、阻塞狀態
一般情況下,把Blocked(阻塞)、Waiting(等待)、TimedWaiting(計時等待)都稱爲阻塞狀態。