一、new(新建) 剛剛建立出來的線程如 new Thread異步
二、Runable (可運行的) 在線程調用了start方法以後ide
三、Running (正在運行的) CPU給此線程分配了時間片,這個狀態是全部線程但願的狀態線程
四、Dead (死亡狀態) run方法執行完畢或者異常退出對象
五、Blocked (阻塞狀態) 資源
阻塞狀態分爲三種同步
(1)等待阻塞:運行線程執行wait方法(wait方法是Object對象的),JVM會把當前線程放進等待池中it
(2)同步阻塞:運行線程獲取對象的同步鎖時,若此時鎖被其餘線程佔用,JVM會把當前線程放進鎖池中io
(3)其餘阻塞:運行線程執行sleep或join方法時(sleep、join方法是Thread對象的),或者線程在處理I/O請求時,JVM會把當前線程置爲阻塞狀態,當sleep超時或者join等待線程停止、或者I/O處理完畢時,線程恢復爲可運行狀態class
wait、sleep、join的區別test
wait是object類的方法
sleep、join是Thread類的方法
sleep時優先級低的線程也有了執行權利,可是sleep時不會釋放鎖資源(抱着鎖睡)
線程的優先級:
線程的優先級用1-10之間的數字表示,最高爲10,最低爲1,默認爲5,子線程優先級與其父同樣。
說到線程,不可避免的要說到鎖
Synchronized關鍵字,鎖的是對象,是類,而不是代碼
當Synchronized和static一塊兒修飾一段代碼或者方法時,就是類鎖了,做爲類鎖時,此類全部的對象將都上鎖。好比下面代碼
public class Student{ // public static Test test= new Test(); public static void main(String[] args) { Thread t1 = new Thread("T1"){ @Override public void run() { test(); } }; Thread t2 = new Thread("T2"){ @Override public void run() { test(); } }; t1.start(); t2.start(); } public static void test(){ Test test= new Test() System.out.println(test); test.fun2(); } }
t1和t2是兩個線程,他們的執行都調用了test方法,test方法新建了一個Test對象
Test類以下
public class Test { public static void fun1(){ System.out.println("fun1方法運行了,調用對象爲"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void fun2(){ System.out.println("fun2方法運行了"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }
兩個線程調用test()方法時,不是一個test對象調用的,每一個線程都new Test()了,可是fun2()是Synchronized而且是static的,也就是加了類鎖,因此這裏,fun2中的代碼仍是同步執行的,而不是異步