单个生产者消费者问题:定义if判断标记,定义notify();
对于多个生产者消费者问题,则要定义while判断标记,因为为了让被唤醒的线程再一次判断标记;
对于多个生产者消费者问题,要定义notifyAll(),因为需要唤醒对方线程,只用notify()容易出现只唤醒本方线程的情况,导致程序中所有线程都等待。
生产者消费者问题程序如下:
class Resource
{
private String name;
private int count=0;
private boolean flag=false;
public synchronized void set(String name)
{
if(flag)
//while(flag)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.name=name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"—--生产者---"+this.name);
flag=true;
notify();
//this.notifyAll();
}
public synchronized void out()
{
if(!flag)
//while(!flag)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"—--消费者---------------"+this.name);
flag=false;
notify();
//this.notifyAll();
}
}
class Producer implements Runnable
{
Resource res;
Producer(Resource res)
{
this.res=res;
}
@Override
public synchronized void run() {
// TODO Auto-generated method stub
while(true)
{
res.set("+商品+");
}
}
}
class Consumer implements Runnable
{
Resource res;
Consumer(Resource res)
{
this.res=res;
}
@Override
public synchronized void run() {
// TODO Auto-generated method stub
while(true)
{
res.out();
}
}
}
public class ProducerConsumerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource res=new Resource();
Producer pro=new Producer(res);
Consumer con=new Consumer(res);
Thread t1=new Thread(pro);
//Thread t2=new Thread(pro);
Thread t3=new Thread(con);
//Thread t4=new Thread(con);
t1.start();
//t2.start();
t3.start();
//t4.start();
}
}
单个生产者消费者运行界面如下: