import java.util.concurrent.locks.*;
class ProducerConsumerDemo
{
public static void main(String[] args)
{
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();
}
}
class Resource
{
private String name;
private int count = 1;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con= lock.newCondition();
// T1 T2
public void set(String name)throws InterruptedException
{
lock.lock();
try
{
while(flag) //if(flag) 可能错误t1 唤醒 t2 在wait()没有判断flag真假 flag已经被t1置为真可是t2不知道,造成重复生产
condition_pro.await(); //try{this.wait();}catch(Exception e){} //唤醒机制是唤醒第一个沉睡的
this.name = name+"...."+count++;
System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
flag = true;
//this.notifyAll(); //防止ti 唤醒 t2 或者 t3唤醒t4 在唤醒时选择唤醒全部线程
condition_con.signal();
}
finally
{
lock.unlock(); //释放锁的动作一定要执行。
}
}
//t3 t4
public void out()throws InterruptedException
{
lock.lock();
while(!flag) //if(!flag)while(!flag)
condition_con.await(); //try{this.wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"消费者....."+this.name);
flag = false;
//this.notifyAll();
condition_pro.signal();
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res = res;
}
public void run()
{
while(true)
{
try
{
res.set("+商品+");
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res = res;
}
public void run()
{
while(true)
{
try
{
res.out();
}
catch(InterruptedException e){}
}
}
}
生产者消费者问题(Java多线程)
最新推荐文章于 2024-11-12 21:14:07 发布