1.利用synchronized实现(不能实现精准唤醒)
public class Main{
int num=0;
Object o = new Object();
private void print(int targetNum) throws InterruptedException {
while(true) {
synchronized (o) {
while (num % 3 != targetNum) {
o.wait();
}
if (num >=100){
break;
}
num++;
System.out.println(Thread.currentThread().getName() + num);
o.notifyAll();
}
}
}
public static void main(String[] args) {
Main main = new Main();
new Thread(() -> {
try {
main.print(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "A").start();
new Thread(() -> {
try {
main.print(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "B").start();
new Thread(() -> {
try {
main.print(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "C").start();
}
}
2.利用ReentrantLock的Condition实现精准唤醒
public class Test77 {
int num;
static ReentrantLock lock= new ReentrantLock();
static Condition c1 = lock.newCondition();
static Condition c2 = lock.newCondition();
static Condition c3 = lock.newCondition();
private void printABC(int taregtNum,Condition currentThread,Condition nextThread){
while (true) {
lock.lock();
try {
while (num % 3 != taregtNum) {
currentThread.await();
}
if (num >= 100){
break;
}
num++;
System.out.println(Thread.currentThread().getName() + num);
nextThread.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
Test77 test77 = new Test77();
new Thread(()->{
test77.printABC(0,c1,c2);
},"A").start();
new Thread(()->{
test77.printABC(1,c2,c3);
},"B").start();
new Thread(()->{
test77.printABC(2,c3,c1);
},"C").start();
}
}