在多线程中,控制并发的手段有很多,如何保证线程按照我们想要的顺序去执行呢? 今天使用CountDownLatch 和 CompletableFuture来简单操作一下.
例题: 三个线程 a b c 实现 a->b->c 的执行顺序。
CountDownLatch解法
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatchA = new CountDownLatch(1);
CountDownLatch countDownLatchB = new CountDownLatch(1);
Thread a = new Thread(()->{
// 输出a的ascii码值
log.info(Thread.currentThread().getName()+" "+(int)'a');
countDownLatchA.countDown();
},"a");
Thread b = new Thread(()->{
try {
// 等待a执行完毕
// 等待计数器归0 然后再向下执行
countDownLatchA.await();
// 输出b的ascii码值
log.info(Thread.currentThread().getName()+" "+(int)'b');
countDownLatchB.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"b");
Thread c = new Thread(()->{
try {
// 等待b执行完毕
// 等待计数器归0 然后再向下执行
countDownLatchB.await();
// 输出c的ascii码值
log.info(Thread.currentThread().getName()+" "+(int)'c');
} catch (InterruptedException e) {
e.printStackTrace();
}
},"c");
c.start();
b.start();
a.start();
}
结果:
CompletableFuture解法
public static void main(String[] args) {
// 三个线程 异步变同步
CompletableFuture<Void> aRes = CompletableFuture.runAsync(()->{
// 输出a的ascii码值
System.out.println("第一步:a"+(int)'a');
});
CompletableFuture<Void> bRes = aRes.thenRun(()->{
// 输出b的ascii码值
System.out.println("第二步:b"+(int)'b');
});
CompletableFuture<Void> cRes = bRes.thenRun(()->{
// 输出c的ascii码值
System.out.println("第三步:c"+(int)'c');
});
}
结果:
参考 大神博客