多執行緒中的wait與notify
wait(),notify(),notifyAll()不屬於Thread類,而是屬於Object基礎類,也就是說每個對像都有wait(),notify(),notifyAll()的功能.因為都個對像都有鎖,鎖是每個對像的基礎,當然操作鎖的方法也是最基礎了。
wait導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或被其他執行緒中斷。wait只能由持有對像鎖的執行緒來呼叫。
wait導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或被其他執行緒中斷。wait只能由持有對像鎖的執行緒來呼叫。
notify喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中一個執行緒(隨機)。直到當前的執行緒放棄此物件上的鎖,才能繼續執行被喚醒的執行緒。同Wait方法一樣,notify只能由持有對像鎖的執行緒來呼叫.notifyall也一樣,不同的是notifyall會喚配所有在此物件鎖上等待的執行緒。
"只能由持有對像鎖的執行緒來呼叫"說明wait方法與notify方法必須在同步塊內執行,即synchronized(obj)之內.再者synchronized程式碼塊內沒有鎖是寸步不行的,所以執行緒要繼續執行必須獲得鎖。相輔相成。
在哪個物件上wait就應該在哪個物件上notify,也就是說wait與notify必須作用在同一個物件上。
看一個很經典的例子(生產者與消費者):
package ProductAndConsume;
import java.util.List;
public class Consume implements Runnable{
private List container = null;
private int count;
public Consume(List lst){
this.container = lst;
}
public void run() {
while(true){
synchronized (container) {
if(container.size()== 0){
try {
container.wait();//容器為空,放棄鎖,等待生產
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
container.remove(0);
container.notify();
System.out.println("我吃了"+(++count)+"個");
}
}
}
}
package ProductAndConsume;
import java.util.List;
public class Product implements Runnable {
private List container = null;
private int count;
public Product(List lst) {
this.container = lst;
}
public void run() {
while (true) {
synchronized (container) {
if (container.size() > MultiThread.MAX) {
//如果容器超過了最大值,就不要在生產了,等待消費
try {
container.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
container.add(new Object());
container.notify();
System.out.println("我生產了"+(++count)+"個");
}
}
}
}
package ProductAndConsume;
import java.util.ArrayList;
import java.util.List;
public class MultiThread {
private List container = new ArrayList();
public final static int MAX = 5;
public static void main(String args[]){
MultiThread m = new MultiThread();
new Thread(new Consume(m.getContainer())).start();
new Thread(new Product(m.getContainer())).start();
new Thread(new Consume(m.getContainer())).start();
new Thread(new Product(m.getContainer())).start();
}
public List getContainer() {
return container;
}
public void setContainer(List container) {
this.container = container;
}
相關文章
- java多執行緒wait notify joinJava執行緒AI
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- Java多執行緒的wait()和notify()例子Java執行緒AI
- Java多執行緒中wait 和 notify 方法理解Java執行緒AI
- 深入執行緒的wait()/notify()執行緒AI
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- Java多執行緒8:wait()和notify()/notifyAll()Java執行緒AI
- 【Java】【多執行緒】兩個執行緒間的通訊、wait、notify、notifyAllJava執行緒AI
- Java多執行緒 -- wait() 和 notify() 使用入門Java執行緒AI
- Java多執行緒/併發11、執行緒同步通訊:notify、waitJava執行緒AI
- 多執行緒(一)、基礎概念及notify()和wait()的使用執行緒AI
- 執行緒間的同步與通訊(2)——wait, notify, notifyAll執行緒AI
- 執行緒間協作——wait、notify、notifyAll執行緒AI
- java多執行緒基礎篇(wait、notify、join、sleep、yeild方法)Java執行緒AI
- Java多執行緒學習(四)等待/通知(wait/notify)機制Java執行緒AI
- 執行緒篇2:[- sleep、wait、notify、join、yield -]執行緒AI
- 執行緒安全(三個條件)Synchronzied,wait和notify執行緒AI
- 併發程式設計——執行緒中sleep(),yield(),join(),wait(),notify(),notifyAll()區別程式設計執行緒AI
- 執行緒與多執行緒執行緒
- wait和notify在鎖競爭中的執行順序AI
- java中關於執行緒間協作所用關鍵字synchronized,wait,notify的用法Java執行緒synchronizedAI
- JSRE中的多工與多執行緒JS執行緒
- 多執行緒join(),wait(),nitify()運用執行緒AI
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- C#中的執行緒(三)多執行緒C#執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- Java 併發程式設計:執行緒間的協作(wait/notify/sleep/yield/join)Java程式設計執行緒AI
- Java中的多執行緒Java執行緒
- RxJava 中的多執行緒RxJava執行緒
- Qt 中的多執行緒QT執行緒
- 多執行緒中的ManualResetEvent執行緒
- GIL與多執行緒執行緒
- Notification與多執行緒執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Java多執行緒1:程式與執行緒概述Java執行緒