Java基礎十二

Java基礎

線程間通信

在這裏插入圖片描述1:wait(),notify(),notifyAll(),用來操作線程爲什麼定義在了Object類中?

1,這些方法存在與同步中。
2,使用這些方法時必須要標識所屬的同步的鎖。
3,鎖可以是任意對象,所以任意對象調用的方法一定定義Object類中。

2:wait(),sleep()有什麼區別?

wait():釋放cpu執行權,釋放鎖。
sleep():釋放cpu執行權,不釋放鎖。

線程間通信:
其實就是多個線程在操作同一個資源,
但是操作的動作不同。

wait:
notify();
notifyAll();

都使用在同步中,因爲要對持有監視器(鎖)的線程操作。
所以要使用在同步中,因爲只有同步才具有鎖。

爲什麼這些操作線程的方法要定義Object類中呢?
因爲這些方法在操作同步中線程時,都必須要標識它們所操作線程持有的鎖,
只有同一個鎖上的被等待線程,可以被同一個鎖上notify喚醒。
不可以對不同鎖中的線程進行喚醒。

也就是說,等待和喚醒必須是同一個鎖。

而鎖可以是任意對象,所以可以被任意對象調用的方法定義Object類中。

線程間通信–生產者消費者

JDK1.5 中提供了多線程升級解決方案。
將同步Synchronized替換成顯式的Lock操作。
將Object中的wait,notify notifyAll,替換了Condition對象。
該對象可以Lock鎖 進行獲取。
該示例中,實現了本方只喚醒對方操作。

Lock:替代了Synchronized
lock
unlock
newCondition()

Condition:替代了Object wait notify notifyAll
await();
signal();
signalAll();

停止線程

stop方法已經過時。

如何停止線程?
只有一種,run方法結束。
開啓多線程運行,運行代碼通常是循環結構。

只要控制住循環,就可以讓run方法結束,也就是線程結束。

特殊情況:
當線程處於了凍結狀態。
就不會讀取到標記。那麼線程就不會結束。

當沒有指定的方式讓凍結的線程恢復到運行狀態時,這時需要對凍結進行清除。
強制讓線程恢復到運行狀態中來。這樣就可以操作標記讓線程結束。

Thread類提供該方法 interrupt();

join方法

join:
當A線程執行到了B線程的.join()方法時,A就會等待。等B線程都執行完,A纔會執行。

join可以用來臨時加入線程執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章