/*JDK1.5升级多线程多组生产者消费者机制*/
import java.util.concurrent.locks.*;
class ProducerConsumerDemo2{
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(pro);
Thread t3=new Thread(con);
Thread t4=new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/*
JDK1.5中提供了多线程升级解决方案。
将同步synchronized替换成显示Lock操作。
将Object中的wait()、notify()、notifyAll()替换了Condition对象中的await()[等待]、signal()[唤醒]、signalAll()[唤醒所有]方法,
Condition对象可以通过Lock锁newCondition()方法进行获取,下列实例通过多线程升级解决方案实现了本方只唤醒对方操作。
*/
// 共同操作资源类
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();
// 生产者方法,运算生产
public void set(String name)throws InterruptedException{
lock.lock(); // 上锁
try{
while(flag){
condition_pro.await(); // 生产者等待
}
this.name=name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
flag=true;
condition_con.signal(); // 唤醒消费者
}finally{
lock.unlock(); // 解锁,释放锁的操作一定要执行
}
}
// 消费者方法,输出消费
public void out()throws InterruptedException{
lock.lock(); // 上锁
try{
while(!flag){
condition_con.await(); // 消费者等待
}
System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);
flag=false;
condition_pro.signal(); // 唤醒生产者
}finally{
lock.unlock(); // 解锁
}
}
}
// 生产者线程
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){
}
}
}
}