執行緒間通訊:多個執行緒在處理同一資源,但是任務卻不同。
等待/喚醒機制。
涉及的方法:
1,wait(): 讓執行緒處於凍結狀態,被wait的執行緒會被儲存到執行緒池中。
2,notify():喚醒執行緒池中乙個執行緒(任意).
3,notifyall():喚醒執行緒池中的所有執行緒。
這些方法都必須定義在同步中。因為這些方法是用於操作執行緒狀態的方法。必須要明確到底操作的是哪個鎖上的執行緒。
操作執行緒的方法wait notify notifyall定義在object類中原因:
因為這些方法是監視器的方法。監視器其實就是鎖。
鎖可以是任意的物件,任意的物件呼叫的方式一定定義在object類中。
關於生產者消費者問題:
多生產者,多消費者的問題:
if判斷標記,只有一次,會導致不該執行的執行緒執行了。出現了資料錯誤的情況。
while判斷標記,解決了執行緒獲取執行權後,是否要執行!
notify:只能喚醒乙個執行緒,如果本方喚醒了本方,沒有意義。而且while判斷標記+notify會導致死鎖。
notifyall解決了本方執行緒一定會喚醒對方執行緒的問題。
jdk1.5以後將同步和鎖封裝成了物件。 並將操作鎖的隱式方式定義到了該物件中,將隱式動作變成了顯示動作。
lock介面: 出現替代了同步**塊或者同步函式。將同步的隱式鎖操作變成現實鎖操作。同時更為靈活。可以乙個鎖上加上多組監視器。
lock():獲取鎖。
unlock():釋放鎖,通常需要定義finally**塊中。
condition介面:出現替代了object中的wait notify notifyall方法。
將這些監視器方法單獨進行了封裝,變成condition監視器物件。
可以任意鎖進行組合。
方法:await(); signal(); signalall();
wait 和 sleep 區別:
1,wait可以指定時間也可以不指定。
sleep必須指定時間。
2,在同步中時,對cpu的執行權和鎖的處理不同。
wait:釋放執行權,釋放鎖。
sleep:釋放執行權,不釋放鎖。
停止執行緒:
1,stop方法。
2,run方法結束。
怎麼控制線程的任務結束呢?
任務中都會有迴圈結構,只要控制住迴圈就可以結束任務。
控制迴圈通常就用定義標記來完成。
3、但是如果執行緒處於了凍結狀態,無法讀取標記。此時結束程序的方法:
可以使用interrupt()方法將執行緒從凍結狀態強制恢復到執行狀態中來,讓執行緒具備cpu的執行資格。
當時強制動作會發生了interruptedexception,記得要處理
多執行緒知識點整理
基本概念 多執行緒程式在較低的層次上擴充套件了多工的概念 乙個程式同時執行多個任務,通常,每乙個任務稱為乙個執行緒,它是執行緒控制的簡稱。可以同時執行乙個以上執行緒的程式稱為多執行緒程式。多程序與多執行緒的區別 每個程序擁有自己的一整套變數,而執行緒則共享資料。相關介面 執行緒的狀態 要獲得乙個執行...
多執行緒知識點整理
多執行緒 多執行緒其實就是指執行緒在同一時間在cpu上同時進行。具體分為兩種模式 一種是指多條執行緒在同乙個cpu上分段時間執行,其實就是並行的意思。一種是多條執行緒在cpu上同時執行的,其實就是併發的意思。多執行緒的問題 多執行緒主要的問是,在多條執行緒運 況下,會出現以下情況 1.多個執行緒同時...
多執行緒知識點整理(一)
多執行緒是為了提高cpu的處理效率,也即提高程式的執行效率而引進的。因為在作業系統中cup,記憶體,硬碟 io裝置 3者之間存在處理速度上的顯著差異這是硬體層面無法解決的矛盾。cpu的處理速度 記憶體 硬碟 io裝置 為了平衡和記憶體之間速度差異cpu中引入了快取,為了能分時復用cpu引入了多執行緒...