生产者、消费者问题是典型的线程同步的问题,这里我们先看一种最简单的情况,就是一个生产者、一个消费者、一个缓冲区。程序必须满足下面的情况:
1.从缓冲区投放产品和取出产品必须是互斥的
2.缓冲区为空时才可以投放产品,缓冲区不为空时才可以取出产品
从操作系统的角度解决这个问题可以使用PV操作,java是支持多线程的,在java中运用对象的方法wait()和notify()可以实现PV操作,以下是具体代码:
public class ProducerConsumerDemo{
public static void main(String[] args) {
Resource r = new Resource();
Producer pro = new Producer(r);
Consumer con = new Consumer(r);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
t1.start();
t2.start();
}
}
class Resource{
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void put(){
if(flag)
try{this.wait();}catch(Exception e){}
this.name = "product------"+count++;
System.out.println(Thread.currentThread().getName()+"--producer--"+this.name);
flag = true;
this.notify();
}
public synchronized void out(){
if(!flag)
try{this.wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"--consumer--"+this.name);
flag = false;
this.notify();
}
}
class Producer implements Runnable{
Resource res = new Resource();
Producer(Resource res){
this.res = res;
}
public void run(){
while(true)
res.put();
}
}
class Consumer implements Runnable{
Resource res = new Resource();
Consumer(Resource res){
this.res = res;
}
public void run(){
while(true)
res.out();
}
}