使用wait()和notifyAll()實作生産者消費者模型
下面将實作三個類,Generater為生産者,Consumer為消費者,Taobao為中間平台。給出代碼。
生産者Generater:
package generater_and_consumer;
public class Generater implements Runnable{
private Taobao taobao;
public Generater(Taobao taobao) {
this.taobao=taobao;
}
@Override
public void run() {
while(true){
taobao.push();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消費者Consumer:
package generater_and_consumer;
public class Consumer implements Runnable{
private Taobao taobao;
public Consumer(Taobao taobao) {
this.taobao=taobao;
}
@Override
public void run() {
while(true){
taobao.take();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
中間平台Taobao:
package generater_and_consumer;
public class Taobao {
private int count;
public final int MAX_COUNT=10;
public synchronized void push(){
while(count>=MAX_COUNT){
try {
System.out.println(Thread.currentThread().getName()+"數量達到上限,生産者暫停生産");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().getName()+"生産者生産,目前庫存為:"+count);
notifyAll();
}
public synchronized void take(){
while(count<=0){
try {
System.out.println(Thread.currentThread().getName()+"目前庫存為零,消費者等待中");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
System.out.println(Thread.currentThread().getName()+"消費者消費了,目前庫存為"+count);
notifyAll();
}
}
最後編寫測試類進行測試:
package generater_and_consumer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
Taobao taobao=new Taobao();
Generater g=new Generater(taobao);
Consumer c=new Consumer(taobao);
new Thread(g).start();
new Thread(g).start();
new Thread(g).start();
new Thread(c).start();
}
}
貼出部分實驗結果:
Thread-0生産者生産,目前庫存為:1
Thread-1生産者生産,目前庫存為:2
Thread-3消費者消費了,目前庫存為1
Thread-2生産者生産,目前庫存為:2
Thread-1生産者生産,目前庫存為:3
Thread-0生産者生産,目前庫存為:4
Thread-2生産者生産,目前庫存為:5
Thread-3消費者消費了,目前庫存為4
Thread-1生産者生産,目前庫存為:5
Thread-3消費者消費了,目前庫存為4
Thread-2生産者生産,目前庫存為:5
Thread-0生産者生産,目前庫存為:6
Thread-1生産者生産,目前庫存為:7
Thread-3消費者消費了,目前庫存為6
Thread-2生産者生産,目前庫存為:7
Thread-0生産者生産,目前庫存為:8
Thread-1生産者生産,目前庫存為:9
Thread-2生産者生産,目前庫存為:10
Thread-3消費者消費了,目前庫存為9
Thread-0生産者生産,目前庫存為:10
Thread-1數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-2生産者生産,目前庫存為:10
Thread-1數量達到上限,生産者暫停生産
Thread-0數量達到上限,生産者暫停生産
Thread-2數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-2生産者生産,目前庫存為:10
Thread-0數量達到上限,生産者暫停生産
Thread-1數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-1生産者生産,目前庫存為:10
Thread-0數量達到上限,生産者暫停生産
Thread-2數量達到上限,生産者暫停生産