阿里面试题-使用三个线程循环有序打印A、B、C怎么实现?
面试的时候,脑子比较蒙,当时这道题也没有答出来。事后思考了一下,暂时能想到四种解决方法。
1.使用Object.wait()/notify()方式
使用wait\notify方法,其实也就是前一个线程A打印完成后使用notify唤醒下一个处于等待状态的线程B打印,然后B和C,C和A也是一样
需要注意的是处于等待态的线程可能会被假唤醒,这时java和操作系统所允许的行为,所以在线程被唤醒后,我们需要检查保护条件是否成立,如果不成立则继续调用wait()方法。
完整代码如下:
Condition.java
package mianshi_code;
import java.util.concurrent.atomic.AtomicInteger;
public class Condition {
AtomicInteger cnt = new AtomicInteger(0);
final int limit ;
public Condition(int printCnt){
limit = printCnt ;
}
public void next(){
cnt.getAndIncrement();}
public int get(){
return cnt.get();}
public boolean stop(){
return cnt.get() >= limit ;
};
}
Mission.java
package mianshi_code;
public interface Mission{
void doJob();
};
CirculatePrint.java
package mianshi_code;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
public class CirculatePrint {
static class ProtectedCondition{
AtomicBoolean state ;
public ProtectedCondition(boolean initVal){
state = new AtomicBoolean(initVal);
}
public ProtectedCondition(){
state = new AtomicBoolean(false);
}
public boolean succeed(){
return state.get();
}
public void change(boolean x){
state.set(x);
}
}
static class WorkThread implements Runnable{
final Object waiting ;
final Object notify ;
String content ;
Condition condition ;
ProtectedCondition proCond ;
ProtectedCondition nextCond ;
public WorkThread(Object a , Object b , String printContent , Condition cond , ProtectedCondition proCon , ProtectedCondition nxtCon)
{
waiting = a ;
notify = b;
content = printContent ;
condition = cond ;
proCond = proCon ;
nextCond = nxtCon;
}
@Override