/* 在jdk1.5版本之后, 出现了一些新的特性,将原理的线程进行了改良。 在java.util.concurrent.locks包中提供了一个接口Lock。替代了synchronized。 synchronized。使用的是锁操作是隐式的。 Lock接口,使用的锁操作是显示的。 由两个方法来完成: lock():获取锁。 unlock():释放锁。 还有一个对象,Condition. 该对象的出现替代了Object中的wait notify notifyAll这些操作监视器的方法。 替代后的方式:await signal signalAll. 接下来,把下列代码替换成JDK1.5版本只有的新对象。 新功能最大好处,就是在一个Lock锁上,可以添加多组监视器对象。 这样就可以实现本方只唤醒对方的线程 锁,是同步的机制.通过锁来控制同步.监视器是用于同步中对象的操作. 比如wait,notify notifyAll.每一组监视器方法对应一个锁. 到了jdk1.5以后,将监视器的方式从Object中,封装到了Condition对象中, 每一个锁lock,可以对应多组监视器对象,这就可以实现本方只唤醒对方的操作。 */ import java.util.concurrent.locks.*; class Res { private String name; private int count = 0; private boolean b = false; //定义一个锁。 Lock lock = new ReentrantLock(); //通过指定的锁,创建了一个该锁上可以使用了监视器对象。 Condition proCon = lock.newCondition(); //升级后的lock可以对应多组监视器对象。 Condition cusCon = lock.newCondition(); public void set(String name) { //获取锁。 lock.lock(); try { while(b) proCon.await(); this.name = name+"--------"+count; count++; System.out.println(Thread.currentThread().getName()+".....生产者...."+this.name); b = true; cusCon.signal(); } catch(InterruptedException e) { } finally { //释放锁 lock.unlock(); } } public void out() { lock.lock(); try { while(!b) cusCon.await(); System.out.println(Thread.currentThread().getName()+"----消费者---"+this.name); b = false; proCon.signal(); } catch (InterruptedException e) { } finally { lock.unlock(); } } } class Pro implements Runnable { private Res r; Pro(Res r) { this.r = r; } public void run() { while(true) { r.set("产品"); } } } class Cus implements Runnable { private Res r; Cus(Res r) { this.r = r; } public void run() { while(true) { r.out(); } } } class ProCusDemo2 { public static void main(String[] args) { Res r = new Res(); Pro p = new Pro(r); Cus c = new Cus(r); Thread t1 = new Thread(p); Thread t2 = new Thread(p); Thread t3 = new Thread(c); Thread t4 = new Thread(c); //t1,t2都是生产者。 //t3,t4都是消费者。 t1.start(); t2.start(); t3.start(); t4.start(); } }