public class Resources { private String name; private int count =1; private boolean flag = false; // wait 和 sleep的区别 //1、wait 可以指定时间也可以不指定 // sleep 必须指定时间 //2、再同步中时,对cpu的执行权和锁的处理不同 // wait 释放执行权,释放锁 // sleep 释放执行权,不释放锁 Lock lock = new ReentrantLock();//创建锁 //获取锁的监视对象 //Condition con = lock.newCondition(); //获取两个监视器,一个监视生产者,一个监视消费者 Condition set_con = lock.newCondition(); Condition qu_con = lock.newCondition(); public void set(String name){ lock.lock();//获取锁 try { while (flag) try { set_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } this.name = name +count; count++; System.out.println(Thread.currentThread().getName()+"产出:"+name); flag = true; qu_con.signalAll(); }finally { lock.unlock();//释放锁 } } public void qu(){ lock.lock();//获取锁 try { while(!flag) try { qu_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"消费产品:"+name); flag = false; set_con.signalAll(); }finally { lock.unlock(); } } }