Condition可以选择性的进行线程通知,在调度线程上更加灵活。
wait/notify方法进行通知时,被通知的线程是有JVM随机选择的,Condition的signal可以"选择性的通知"
生产者/消费者模式 打印奇数偶数
//锁对象 ,必须是同一把锁public class Num { int i=1; boolean flag=false; Lock lock=new ReentrantLock(); Condition condition=lock.newCondition(); } public class EvenPrint implements Runnable { private Num num; public EvenPrint(Num num){ this.num=num; } @Override public void run() { while (num.i<=500){ //上锁 num.lock.lock(); if(num.i%2==0){ System.out.println(Thread.currentThread().getName()+ "偶数——————"+num.i); num.i++; //唤醒 奇数线程 num.condition.signal(); }else{ try { //等待 num.condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class OddPrint implements Runnable { private Num num; public OddPrint(Num num) { this.num = num; } @Override public void run() { while (num.i <= 500) { num.lock.lock(); if (num.i%2 !=0) { System.out.println(Thread.currentThread().getName() + "奇数——————" + num.i); num.i++; num.condition.signal(); } else { try { num.condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class Run { public static void main(String[] args) { Num num = new Num(); OddPrint oddPrint = new OddPrint(num); EvenPrint evenPrint = new EvenPrint(num); Thread thread1 = new Thread(oddPrint); Thread thread2 = new Thread(evenPrint); thread1.setName("奇数线程"); thread1.start(); thread2.setName("偶数线程"); thread2.start(); } }