1. 程式人生 > 其它 >java 多執行緒基礎知識

java 多執行緒基礎知識

用多執行緒只有一個目的,那就是更好的利用cpu的資源。

執行緒與程序:

程序:正在進行中的程式,一個程序包含多個執行緒。

並行與併發:

並行:多個cpu例項或者多臺機器同時執行一段處理邏輯,是真正的同時。併發:通過cpu排程演算法,讓使用者看上去同時執行,實際上從cpu操作層面不是真正的同時。

有資料共享才會存線上程安全問題,否則沒有。怎樣解決?同步、鎖。

執行緒安全:

經常用來描繪一段程式碼。指在併發的情況之下,該程式碼經過多執行緒使用,執行緒的排程順序不影響任何結果。這個時候使用多執行緒,我們只需要關注系統的記憶體,cpu是不是夠用即可。

wait和sleep方法的區別

1、這兩個方法來自不同的類分別是Thread和Object

2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法(鎖程式碼塊和方法鎖)。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用(使用範圍)

4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

5、sleep方法屬於Thread類中方法,表示讓一個執行緒進入睡眠狀態,等待一定的時間之後,自動醒來進入到可執行狀態,不會馬上進入執行狀態,

因為執行緒排程機制恢復執行緒的執行也需要時間,一個執行緒物件呼叫了sleep方法之後,並不會釋放他所持有的所有物件鎖,所以也就不會影響其他程序物件的執行。但在sleep的過程中過程中有可能被其他物件呼叫它的interrupt(),產生InterruptedException異常,如果你的程式不捕獲這個異常,執行緒就會異常終止,進入TERMINATED狀態,如果你的程式捕獲了這個異常,那麼程式就會繼續執行catch語句塊(可能還有finally語句塊)以及以後的程式碼。
6、注意sleep()方法是一個靜態方法,也就是說他只對當前物件有效,通過t.sleep()讓t物件進入sleep,這樣的做法是錯誤的,它只會是使當前執行緒被sleep 而不是t執行緒
7、wait屬於Object的成員方法,一旦一個物件呼叫了wait方法,必須要採用notify()和notifyAll()方法喚醒該程序;如果執行緒擁有某個或某些物件的同步鎖,那麼在呼叫了wait()後,這個執行緒就會釋放它持有的所有同步資源,而不限於這個被呼叫了wait()方法的物件。wait()方法也同樣會在wait的過程中有可能被其他物件呼叫interrupt()方法而產生

用wait()方法時,一般是需要while迴圈而不是if。

while會一直執行迴圈,直到條件滿足,執行條件才會繼續往下執行。if只會執行一次判斷條件,不滿足就會等待。這樣就會出現問題。

我們知道用notify() 和notifyAll()可以喚醒執行緒,一般我們常用的是notifyAll(),因為notify(),只會隨機喚醒一個睡眠執行緒,並不一定是我們想要喚醒的執行緒。
如果使用的是notifyAll(),喚醒所有的執行緒,那你怎麼知道他想喚醒的是某個正在等待的wait()執行緒呢,如果用while()方法,就會再次判斷條件是不是成立,滿足執行條件了,
就會接著執行,而if會直接喚醒wait()方法,繼續往下執行,根本不管這個notifyAll()是不是想喚醒的是自己還是別人,可能此時if的條件根本沒成立。