參考資料: https://www.cnblogs.com/happy...
參考JVM虛擬機一書的內容,進行總結。html
關於線程的理解,咱們將一個線程當作是一個任務task,這樣應該更好理解。app
每個線程就是一個任務,咱們要執行一個任務,這個任務若是完成了,那麼咱們的程序功能就獲得了實現。由於只有一個CPU,也就是說只有一個幹活的人。那麼咱們開始了那麼多的任務,CPU就須要頻繁地切換任務來執行,這樣咱們就能更好地理解任務的一些狀態了。spa
無限等待 線程
對於無線等待的任務,第一種狀況。code
假設有任務A和任務B,咱們在任務B的執行代碼中:A.join();
,這表示把任務B放在任務A的後面執行,那麼任務B只有等待任務A作完以後才能夠繼續執行(準確地說是進入運行狀態)。也就是說咱們沒法肯定任務B等待的時間,這取決於任務A,因此這叫作無限等待。htm
對於無限等待的任務,第二種狀況。對象
假設有任務C和任務D,咱們在任務C的執行代碼中:Object.wait()
,這表示把任務C擱置,讓它無限等待下去。任務C何時能夠繼續執行呢?只有當其餘任務調用了notify()
、notifyAll()
方法以後,這表示CPU將去看看那些無限等待的任務(特指使用了wait()
方法而等待的任務),而後把它們喚醒(這些任務又進入了運行狀態)。這種狀況下,咱們沒法肯定任務C等待的時間,這取決於notify()
和notifyAll()
方法的通知,這就是無限等待的第二種狀況。blog
新建(New) :使用new Thread()
建立一個線程以後。隊列
運行(Runnable) :使用Thread.start()
方法以後。啓動一個線程,該線程會進入等待隊列等待CPU的執行,所以能夠細分爲runnable和running狀態。rem
無限等待(waiting) :處於這種狀態的線程,不會被分配CPU執行時間,須要等待其餘線程顯式地喚醒,而後進入運行狀態。
Thread.join()
方法。將會一直等待上一個線程的執行結束,而後被上一個線程喚醒。Object.wait()
方法。將會一直等待,直到其餘線程中使用了notify()、notifyAll()進行喚醒。有限等待(timed waiting) :處於這種狀態的線程,不會被分配CPU執行時間,既能夠被其餘線程顯式地喚醒,也能夠在必定時間後由系統自動喚醒,而後進入運行狀態。
Thread.sleep(timeout)
方法。該方法不會釋放持有的對象鎖。Object.wait(timeout)
方法。該方法會釋放持有的鎖。Thread.join(timeout)
方法。阻塞(blocked) :阻塞和等待的區別在於,阻塞是在等待獲取一個排它鎖,由於該線程獲取不到鎖因此被阻塞住而不能容許;而等待則是等待一段時間或者是等待被喚醒,等待狀態並非等待獲取鎖。這個狀態有個特色,一個線程請求鎖,獲得以後該線程進入阻塞狀態;而其餘線程再來請求鎖,因爲得不到而阻塞;當該鎖釋放後,被阻塞的線程獲得鎖就進入了運行狀態。
synchronized
修飾的代碼塊、方法。使得線程之間有並行變成串行執行。結束(terminated) :當線程的run()
方法執行結束後,該線程就結束了。
圖示: