1114. 按序打印
多种解法,都是多线程常用工具
volite:
class Foo {
private volatile int flag=-1;
// private AtomicInteger firstJobDone = new AtomicInteger(0);
public Foo() {}
public void first(Runnable printFirst) throws InterruptedException {
// printFirst.run() outputs "first".
printFirst.run();
// mark the first job as done, by increasing its count.
flag=1;
}
public void second(Runnable printSecond) throws InterruptedException {
while (flag != 1) {
// waiting for the first job to be done.
}
// printSecond.run() outputs "second".
printSecond.run();
// mark the second as done, by increasing its count.
flag=2;
}
public void third(Runnable printThird) throws InterruptedException {
while (flag != 2) {
// waiting for the second job to be done.
}
// printThird.run() outputs "third".
printThird.run();
}
}
原子类:
class Foo {
private AtomicInteger firstJobDone = new AtomicInteger(0);
private AtomicInteger secondJobDone = new AtomicInteger(0);
public Foo() {}
public void first(Runnable printFirst) throws InterruptedException {
// printFirst.run() outputs "first".
printFirst.run();
// mark the first job as done, by increasing its count.
firstJobDone.incrementAndGet();
}
public void second(Runnable printSecond) throws InterruptedException {
while (firstJobDone.get() != 1) {
// waiting for the first job to be done.
}
// printSecond.run() outputs "second".
printSecond.run();
// mark the second as done, by increasing its count.
secondJobDone.incrementAndGet();
}
public void third(Runnable printThird) throws InterruptedException {
while (secondJobDone.get() != 1) {
// waiting for the second job to be done.
}
// printThird.run() outputs "third".
printThird.run();
}
}
阻塞队列:
class Foo {
BlockingQueue queue=new ArrayBlockingQueue(1);
BlockingQueue queue1=new ArrayBlockingQueue(1);
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
System.out.println("111");
printFirst.run();
queue.add(1);
}
public void second(Runnable printSecond) throws InterruptedException {
queue.take();
System.out.println("222");
printSecond.run();
queue1.add(2);
queue.add(3);
}
public void third(Runnable printThird) throws InterruptedException {
queue1.take();
System.out.println("333");
queue.take();
printThird.run();
}
}
计时器:
class Foo {
private CountDownLatch second=new CountDownLatch(1);
private CountDownLatch three=new CountDownLatch(1);
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
// printFirst.run() outputs "first". Do not change or remove this li