線程通信 1、場景:生產者和消費者問題 ==倉庫、生產者、消費者 倉庫只能存放一個產品,生產者將生產出來的產品放入倉庫,消費者將倉庫中產品取走 如果倉庫中沒有產品,生產者將產品放入倉庫,否則停止生產並等待(阻塞),直到倉庫中的產品被消費者取走 如果倉庫中有產品,消費者可以將產品取走消費,否則停止消費 ...
線程通信
1、場景:生產者和消費者問題
==倉庫、生產者、消費者
====倉庫只能存放一個產品,生產者將生產出來的產品放入倉庫,消費者將倉庫中產品取走
====如果倉庫中沒有產品,生產者將產品放入倉庫,否則停止生產並等待(阻塞),直到倉庫中的產品被消費者取走
====如果倉庫中有產品,消費者可以將產品取走消費,否則停止消費並等待,直到倉庫中再次放入產品為止
生產者和消費者共用一個資源,並且生產者和消費者之間相互依賴,互為條件。
==生產者消費者問題中,僅有synchronized是不夠的,
synchronized可以阻止併發更新同一個共用資源,實現了同步,但不能用來實現不同線程之間的消息傳遞(通信)
2、線程通信的操作方法
(Object類的方法,只能在同步方法或同步代碼塊中使用,否則會拋出異常llegalMonitorStateException)
(1)wait() :線程一直等待,直到其它線程通知,會釋放鎖
(2)wait(long timeout):指定等待的毫秒數
(3)notify():喚醒一個處於等待狀態的線程
(4)notifyAll():喚醒同一個對象上所有調用wait()方法的線程,優先順序高的線程先調度。
3、線程通信的方式:
(1)管程法(生產者 緩衝區 消費者)
併發協作模型:生產者消費者模式 管程法
==生產者:負責生產數據的模塊(方法、對象、線程、進程)
==消費者:負責處理數據的模塊(方法、對象、線程、進程)
==緩衝區:消費者不直接使用生產者的數據,生產者將生產好的數據放入緩衝區,消費者從緩衝區拿出數據
//測試生產者消費者模式 : 管程法 (生產者 消費者 緩衝區)
public class TestPC {
public static void main(String[] args) {
SynContainer synContainer = new SynContainer();
new Productor(synContainer).start();
new Consumer(synContainer).start();
}
}
//生產者
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container){
this.container = container;
}