一 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); // 第三次進入超時等待 } }