線程通信
應用場景:生産者和消費者模式
- 假設倉庫中隻能存放一件産品,生産者将生産出來的産品放入倉庫,消費者将倉庫中産品取走消費;
- 如果倉庫中沒有産品,則生産者将産品放入倉庫,否則停止生産并等待,直到倉庫中的産品被消費取走為止;
- 如果倉庫中放有産品,則消費者可以将産品取走消費,否則停止消費并等待,直到倉庫中再次放入産品為止;
線程通信 - 分析
- 這是一個線程同步問題,生産者和消費者共享一個資源,而是生産了産品之後,又需要馬上通知消費者消費;
- 對于消費者,在消費之後,要通知生産者已經結束消費,需要生産新的産品以供消費;
- 在生産消費者問題中,僅有synchronized是不夠的;
- synchronized 可阻止并發更新同一個共享資源,實作了同步;
- synchronized 不能用來實作不同線程之間的消息傳遞(通信);
方法
方法名 | 作用 |
wait() | 表示線程一直等待,直到其他線程通知,與sleep不同,會釋放鎖 |
wait(long timeOut) | 指定等待的毫秒數 |
notify() | 喚醒一個處于等待狀态的線程 |
notifyAll() | 喚醒同一個對象上所有調用wait()方法的線程,優先級别高的線程優先排程 |
均是Object類的方法,都隻能在同步方法或者同步代碼塊中使用,否則會抛出異常IllegalMonitorStateException |
解決方式1:生産/消費者模式-管程法
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM3UTMxMmZhZWM5I2MhNzMzYzXzMDMzkDM4IzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)