要求:实现三个线程,A线程执行完成后B线程执行,B线程执行完成后C线程执行
PS:个人娱乐,欢迎讨论,欢迎斧正
/**
* @author: lizheng
* @create: 2020-08-03
*/
public class ThreadTest {
public static void main(String[] args) {
Foo foo = new Foo();
CountDownLatch countDownLatchFirst = new CountDownLatch(1);
CountDownLatch countDownLatchSecond= new CountDownLatch(1);
FirstThread firstThread = new FirstThread(foo,null, countDownLatchFirst);
SecondThread secondThread = new SecondThread(foo, countDownLatchFirst, countDownLatchSecond);
ThreeThread threeThread = new ThreeThread(foo, countDownLatchSecond, null);
threeThread.start();
secondThread.start();
firstThread.start();
}
}
class FirstThread extends MyThread{
public FirstThread(Foo foo, CountDownLatch preCountDownLatch, CountDownLatch processCountDownLatch) {
super(foo, preCountDownLatch, processCountDownLatch);
}
void doSomething() {
foo.one();
}
}
class SecondThread extends MyThread{
public SecondThread(Foo foo, CountDownLatch preCountDownLatch, CountDownLatch processCountDownLatch) {
super(foo, preCountDownLatch, processCountDownLatch);
}
void doSomething() {
foo.two();
}
}
class ThreeThread extends MyThread{
public ThreeThread(Foo foo, CountDownLatch preCountDownLatch, CountDownLatch processCountDownLatch) {
super(foo, preCountDownLatch, processCountDownLatch);
}
void doSomething() {
foo.three();
}
}
abstract class MyThread extends Thread{
protected Foo foo;
protected CountDownLatch preCountDownLatch;
private CountDownLatch processCountDownLatch;
public MyThread(Foo foo, CountDownLatch preCountDownLatch, CountDownLatch processCountDownLatch) {
this.foo = foo;
this.preCountDownLatch = preCountDownLatch;
this.processCountDownLatch = processCountDownLatch;
}
public void run() {
if (preCountDownLatch != null) {
try {
preCountDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
doSomething();
if (processCountDownLatch != null) {
processCountDownLatch.countDown();
}
}
abstract void doSomething();
}
class Foo {
public void one() {
System.out.println("one");
}
public void two() {
System.out.println("two");
}
public void three() {
System.out.println("three");
}
}