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();
}
}