新建乙個產品person
package cn.lucky.producer;
/** * @author lucky
*/public class person
public synchronized void pop()
}
新建生產者
package cn.lucky.producer;
/** * @author lucky
*/public class producer implements runnable
@override
public void run() else }}
}
新建消費者
package cn.lucky.producer;
/** * @author lucky
*/public class consumer implements runnable
@override
public void run() }}
測試
package cn.lucky.producer;
/** * @author lucky
*/public class test
}).start();
new thread(new runnable()
}).start();}}
結果
我們發現,全是marry,跟我們預期的tom---11,marry---21迴圈不一樣。
我們加個執行緒休眠擴大一下現象。
雖然出現了tom---11,但是我們還是沒有達到理想效果,要如何達到呢?
首先我們對生產消費加個鎖
我們會發現要麼全是tom,要麼全是marry,要麼一半連續出現tom,一半連續marry
同步鎖池的概念就出現了:
同步鎖池:同步鎖必須選擇多個執行緒共同的資源物件,而乙個執行緒獲得鎖的時候,別的執行緒都在同步鎖池等待獲取鎖;當那個執行緒釋放同步鎖了,其他執行緒便開始由cpu排程分配鎖
這是object類中的方法
wait():執行該方法的執行緒物件,釋放同步鎖,jvm會把該執行緒放到等待池中,等待其他執行緒喚醒該執行緒
notify():執行該方法的執行緒喚醒在等待池中等待的任意乙個執行緒,把執行緒轉到鎖池中等待(注意鎖池和等待池的區別)
notifyall():執行該方法的執行緒喚醒在等待池中等待的所有執行緒,把執行緒轉到鎖池中等待。
注意:上述方法只能被同步監聽鎖物件來呼叫,這也是為啥wait() 和 notify()方法都在 object 物件中,因為同步監聽鎖可以是任意物件,只不過必須是需要同步執行緒的共同物件即可,否則別的物件呼叫會報錯:j**a.lang.illegalmonitorstateexception
**如下:
package cn.lucky.producer;
/** * @author lucky
*/public class person
thread.sleep(10);
this.name = name;
this.age = age;
flag=false;
this.notifyall();
} catch (interruptedexception e)
}public synchronized void pop()
thread.sleep(10);
system.out.println(this.name + "---" + this.age);
flag=true;
this.notifyall();
} catch (interruptedexception e) }}
測試結果:
完結!
生產者消費者執行緒
include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...
生產者消費者執行緒
該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...