使用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数量达到上限,生产者暂停生产