文章出處

1.線程的幾種狀態

線程有以下幾種狀態:

1.NEW:已經創建,但是還沒有執行,如以下代碼輸出結果為NEW

Thread thread = new Thread();
System.out.println(thread.getState());

2.RUNNABLE:正在運行的線程,如以下代碼輸出為:RUNNABLE

final Thread thread = new Thread(){
      @Override
      public void run() {
          System.out.println(this.getState());
      }
  };
  thread.start();

3.BLOCKED:正在等待獲取鎖的線程,這種需要兩個線程同時訪問同步方法:如下代碼所示:
private static final Object LOCK = new Object();

public static void main(String [] args){
    Thread thread = new Thread(){
        @Override
        public void run() {
            lock();
        }
    };

    Thread thread2 = new Thread(){
        @Override
        public void run() {
            lock();
        }
    };
    thread.setName("線程1");
    thread2.setName("線程2");
    thread.start();
    thread2.start();
}

public static void lock(){

    synchronized (LOCK){
        try {
            Thread.sleep(1000000);
        }catch (Exception e){

        }
    }
}

執行以上程序,使用jstack可以看到如下結果:

可以看到線程1的狀態是BLOCKED,線程2的狀態是TIMED_WAITING

4.WAITING:由于調用了Object.wait、Thread.join或者LockSupport.park方法處理等待其他線程喚醒的狀態

5.TIMED_WAITING:指定等待時間的等待狀態

6.TERMINATED:已經完成的線程

Thread thread = new Thread(new Runnable() {
        public void run() {
        }
    });
    thread.start();
    try {
        thread.join();
    }catch (Exception e){
    }
    System.out.println(thread.getState().name());

以上代碼執行結果:TERMINATED

參考:java.lang.Thread.State

2.同步和異步

同步和異步是用來行用方法調用的兩個詞,同步調用一個方法時,只有在方法執行結束之后才會返回執行后面的代碼,而異步調用時候,無論調用的方法有沒有執行完,調用的線程都會返回繼續執行后面的代碼。

3.阻塞和非阻塞

阻塞和非阻塞我認為是和同步和異步同一種概念針對不同對象的兩種說法,前者是針對線程而講的,當多個線程訪問共享資源,當有一個線程正在訪問,而其他線程正在等待的狀態就稱為阻塞。反之為非阻塞。最常見的阻塞現象是添加synchronized關鍵字。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()