
附件下载:
线程的基本操作 null
JUC中等待多线程完成的工具类CountDownLatch,必备技能 null
JAVA线程池,这一篇就够了 null
JUC中的Executor框架详解1 null
JUC中的Executor框架详解2 null
JUC中的Executor框架详解1 null
JUC中的Executor框架详解1 null
JUC中工具类CompletableFuture,必备技能 null
这是java高并发系列第31篇。
环境:jdk1.8。
java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求:
在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有什么优缺点?
结合这个需求,我们使用6种方式,来对之前学过的知识点做一个回顾,加深记忆。
方式1:Thread的join()方法实现
代码:
输出:
代码中通过join方式阻塞了当前主线程,当thread线程执行完毕之后,join方法才会继续执行。
此行结论有误,请跳过:join的方式,只能阻塞一个线程,如果其他线程中也需要获取thread线程的执行结果,join方法无能为力了。
关于join()方法和线程更详细的使用,可以参考: 线程的基本操作
方式2:CountDownLatch实现
代码:
输出:
上面代码也达到了预期效果,使用CountDownLatch可以让一个或者多个线程等待一批线程完成之后,自己再继续;CountDownLatch更详细的介绍见:
JUC中等待多线程完成的工具类CountDownLatch,必备技能
方式3:ExecutorService.submit方法实现
代码:
输出:
使用ExecutorService.submit方法实现的,此方法返回一个Future,future.get()会让当前线程阻塞,直到Future关联的任务执行完毕。
相关知识:
方式4:FutureTask方式1
代码:
输出:
代码中使用FutureTask实现的,FutureTask实现了Runnable接口,并且内部带返回值,所以可以传递给Thread直接运行,futureTask.get()会阻塞当前线程,直到FutureTask构造方法传递的任务执行完毕,get方法才会返回。关于FutureTask详细使用,请参考:
JUC中的Executor框架详解1
方式5:FutureTask方式2
代码:
输出:
创建了一个FutureTask对象,调用futureTask.get()会阻塞当前线程,子线程中休眠了3秒,然后调用futureTask.run();当futureTask的run()方法执行完毕之后,futureTask.get()会从阻塞中返回。
注意:这种方式和方式4的不同点。
关于FutureTask详细使用,请参考:
JUC中的Executor框架详解1
方式6:CompletableFuture方式实现
代码:
输出:
CompletableFuture.supplyAsync可以用来异步执行一个带返回值的任务,调用completableFuture.get()
会阻塞当前线程,直到任务执行完毕,get方法才会返回。
关于CompletableFuture更详细的使用见:
JUC中工具类CompletableFuture,必备技能
