java 多線程 線程的狀態和操作系統中進程狀態的對應關系


一 java中的線程

操作系統的進程五個狀態:新建,就緒,運行,等待,結束

線程一共有六種狀態

TERMINATED   結束 包括正常結束和異常結束
NEW                  新建狀態 也就是對象創建了,但還沒執行start方法

BLOCKED         鎖池狀態(也有說是阻塞狀態) 等待的一種,特指等着獲得鎖,也就是被堵在syn方法外面。被掛到鎖對象的阻塞隊列上了

WAITING          等待事件發生,常常使用wait()方法 進入此狀態,掛到鎖對象的等待隊列上。。
TIMED_WAITING  跟等待狀態差不多,只不過時間到了,就進入可運行狀態了(但是隨之就有可能因為沒搶到鎖,到鎖池狀態)

      以上三個狀態個人認為都是操作系統中的 等待(阻塞)狀態
 
RUNNABLE     可運行狀態   是操作系統中就緒狀態和運行狀態 (這里找到官方描述:處於 runnable 狀態下的線程正在 Java 虛擬機中執行,但它可能正在等待來自於操作系統的其它資源,比如處理器。 )

做了個測試 一個線程 執行   Scanner scanner = new Scanner(System.in);  發現此線程處於runnalbe狀態。。。

 

 

 

總結: java線程把就緒和運行合為一個狀態---可運行 另外比如讀文件 輸入輸出等操作  在java中都被定義為可運行狀態;同時把等待分成三個狀態 等待 ,阻塞(鎖池) ,定時等待;

    但是java中的線程狀態,我的理解是為了方便java編程者更好的進行並發編程。。實際上通過jvm的映射 最終的線程狀態還是通過操作系統的狀態實現。

 

二 demo 

以下的這一段代碼可以更好的體現   這幾種狀態 當然0,1,2,3的順序可能不一致,看調度結果

public class Main {
    private static  int i = 0;
     static class MyThread extends  Thread{
         @Override
         public void run() {
             try {
                 get();
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }

    public static void main(String[] args) throws InterruptedException {


        Thread[] arr = new Thread[10];

        arr[0] = new MyThread();
        arr[1] = new MyThread();
        arr[2] = new MyThread();
        arr[3] = new MyThread();
        arr[4] = new MyThread();
        arr[0].start();
        arr[1].start();
        arr[2].start();
        arr[3].start();
        Thread.currentThread().sleep(1000);   //主線程等一下 讓四個子線程先執行
        System.out.println(arr[0].getState());  //BLOCKED 第四名 沒搶到鎖 鎖池狀態
        System.out.println(arr[1].getState());   //WAITING 第一名 搶到鎖 進入等待狀態
        System.out.println(arr[2].getState());  // TIMED_WAITING 第三名  進入定時等待狀態
        System.out.println(arr[3].getState());   //TERMINATED 第二名  直接return 結束
        System.out.println(arr[4].getState());   //還沒start
        System.out.println(Thread.currentThread().getState()); // 主線程 運行狀態



        }

    public static synchronized void get() throws InterruptedException {
         i++;
         if(i==1)
          Main.class.wait();  //第一次進入 等待
         if(i==2)
             return;         //第二次進入 直接返回

      Thread.currentThread().sleep(1000*5);  // 第三次進入超時等待

    }
    }

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM