Condition实现精确通知唤醒
package JUC;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProviderConsumerJUC2 {
public static void main(String[] args) {
DataJUC2 data = new DataJUC2();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printA();
}
},"A") .start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printB();
}
},"B") .start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printC();
}
},"C") .start();
}
}
class DataJUC2{
private int number = 1;
private Lock lock = new ReentrantLock();
Condition newCondition = lock.newCondition();
Condition newCondition2 = lock.newCondition();
Condition newCondition3 = lock.newCondition();
public void printA() {
lock.lock();
try {
while (number!=1) {
newCondition.await();
}
System.out.println(Thread.currentThread().getName() + "=> A");
number = 2;
newCondition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB() {
lock.lock();
try {
while (number!=2) {
newCondition2.await();
}
System.out.println(Thread.currentThread().getName() + "=> B");
number = 3;
newCondition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC() {
lock.lock();
try {
while (number!=3) {
newCondition3.await();
}
System.out.println(Thread.currentThread().getName() + "=> C");
number = 1;
newCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}