面试时要求给出一个循环打印线程123的问题,特在此记录一下
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class CycleCallABC {
private int num = 1;
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void sub1() {
try{
lock.lock();
while (num != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num = 2;
Thread.sleep(1000);
System.out.println("线程1运行完毕");
condition2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void sub2() {
try{
lock.lock();
while (num != 2){
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num = 3;
Thread.sleep(1000);
System.out.println("线程2运行完毕");
condition3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void sub3() {
try{
lock.lock();
while (num != 3){
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num = 1;
Thread.sleep(1000);
System.out.println("线程3运行完毕");
condition1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CycleCallABC cycleCallABC = new CycleCallABC();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
cycleCallABC.sub1();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
cycleCallABC.sub2();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
cycleCallABC.sub3();
}
}
}).start();
}
}