import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo {
public static void main(String[] args) {
ShareData shareData = new ShareData();
new Thread(() -> {
for (int j = 0; j < 5; j++) {
try {
shareData.threadA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "AAA").start();
new Thread(() -> {
for (int j = 0; j < 5; j++) {
try {
shareData.threadB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "BBB").start();
}
}
class ShareData {
int num = 1;
private Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
void threadA() throws InterruptedException {
lock.lock();
while (num != 1) {
condition1.await();
}
for (int i = 0; i < 3; i++) {
System.out.println(i + "AA");
}
condition2.signal();
num = 2;
lock.unlock();
}
void threadB() throws InterruptedException {
lock.lock();
while (num != 2) {
condition2.await();
}
for (int i = 0; i < 3; i++) {
System.out.println(i + "BB");
}
num = 1;
condition1.signal();
lock.unlock();
}
}