併發編程3.線程的生命週期

線程狀態的定義

線程對象在不同的運行時期有不同的狀態,這些狀態就定義在java.lang.Thread.State枚舉類中

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

線程狀態的解釋

  • 尚未啓動的線程處於NEW狀態
  • 在JVM中執行的線程處於RUNNABLE 狀態
  • 受阻塞並 等待某個監視器鎖的線程處於BLOCKED 狀態
  • 等待另一個線程來執行某一特定操作的線程處於WAITING 狀態
  • 等待另一個線程來執行取決於指定等待時間的操作的線程處於TIMED_WAITING 狀態
  • 已退出的線程處於TERMINATED 狀態

驗證線程狀態

  • NEW
Thread t = new Thread();
System.out.println(t.getState());

Thread對象在創建後,沒有調用start方法前,其狀態爲NEW

  • RUNNABLE
Thread t = new Thread(()-> System.out.println(Thread.currentThread().getState()));
t.start();

調用start方法後,線程在執行時,其狀態爲RUNNABLE

  • TERMINATED
Thread t = new Thread();
TimeUnit.SECONDS.sleep(1);
System.out.println(t.getState());

線程執行結束後,其狀態爲TERMINATED

  • BLOCKED
public class BlockedTest {

    public synchronized static void service(){
        System.out.println(Thread.currentThread().getName() + "進入業務方法");
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{service();});
        Thread t2 = new Thread(()->{service();});
        t1.setName("T1");
        t2.setName("T2");

        t1.start();
        TimeUnit.SECONDS.sleep(1);
        t2.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("T2 狀態" + t2.getState());
    }
}

線程T1 執行後,獲得了鎖,在T2 執行時,發現鎖已經被佔用,所以出於等待狀態,所以在最後輸出時,T2的狀態爲BLOCKED

  • WAITING
public class WaitThread {

    public static final Object lock = new Object();

    public static void main(String[] args) {
        Thread t = new Thread(()-> {
            try {
                synchronized (lock){
                    lock.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t.start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(t.getState());
    }
}

當前線程中的鎖對象執行了wait方法之後,線程就處於WAITING 狀態,如果線程中的鎖對象想執行了wait(long timeout) ,線程就處於TIMED_WAITING 狀態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章