------------- Sleep
Main Thread Id: Thread[main,5,main]
supplyAsyncWithSleep Thread Id : Thread[ForkJoinPool.commonPool-worker-1,5,main]------thenApply Thread Id : Thread[ForkJoinPool.commonPool-worker-1,5,main]
supplyAsyncWithSleep Thread Id : Thread[ForkJoinPool.commonPool-worker-1,5,main]------thenApplyAsync Thread Id : Thread[ForkJoinPool.commonPool-worker-1,5,main]
------------- No Sleep
Main Thread Id: Thread[main,5,main]
supplyAsyncNoSleep Thread Id : Thread[ForkJoinPool.commonPool-worker-2,5,main]------thenApply Thread Id : Thread[main,5,main]
supplyAsyncNoSleep Thread Id : Thread[ForkJoinPool.commonPool-worker-2,5,main]------thenApplyAsync Thread Id : Thread[ForkJoinPool.commonPool-worker-2,5,main]
@SneakyThrows private void test() { CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { return "任务A"; }).thenApplyAsync(s -> { System.out.println(s); return "任务B"; .
private void test() {
CompletableFuture future = CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
try {...
CompletableFuture.supplyAsync
Future是Java5新加的一个接口,它提供了一种异步并行计算的功能。如果主线程需要执行一个很耗时的计算任务,我们就可以通过future把这个任务放到异步线程中执行。主线程继续处理其他任务,处理完成后,再通过Future获取计算结果。
老爸有俩孩子:小红和小明。老爸想喝酒了,他让小红去买酒,小红出去了。然后老爸突然想吸烟了,于是老爸让小明去买烟。在面对对象的思想中,一般会把买东西,然后买回来这件事作为一个方法,如果按照顺序结构或者使用多线程同步
所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。
JDK5新增了Future接口,用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和
通过调用异步方法(方法后边加Async后缀),串联起来的CompletableFuture可以异步地执行(使用ForkJoinPool.commonPool())。
static void thenApplyAsyncExample() {
CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(s -> {
assertTrue(Thread.currentThr
使用jdk8中的java.util.concurrent.CompletableFuture非常方便进行异步任务编排
1.supplyAsync 开启异步任务
* 1.小白点菜
* 2.厨师做菜
* 3.小白吃饭
public static void test1() {
SmallTools.printTimeAndThread("小白进入餐厅");
SmallTools.printTimeAndThread("小白点了 番茄炒蛋+一碗米饭");
//启动一个线
一:创建任务并执行任务
1:无参创建:CompletableFuture<String> noArgsFuture = new CompletableFuture<>();
2:传入相应任务,无返回值(runAsync方法可以在后台执行异步计算,但是此时并没有返回值。持有一个Runnable对象。)
CompletableFuture noReturn = Comp...
我们在精通多线程,没用过CompletableFuture(二)中介绍了创建CompletableFuture的四种方式,我们知道了如何通过CompletableFuture来处理异步任务,之前我们对比CompletableFuture和Future说到,CompletableFuture可以通过异步回调来通知异步任务执行完成,这里我们就一起看看CompletableFuture是如何做到这点的。
ThenApply/ThenApplyAsync
对于ThenApply/ThenApplyAsy
@[toc]
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。
一、创建异步任务
1、Future.submit
通常的线程池接口类ExecutorService,其中execute方法的返回值是void,即无法获取异步任务的执行状态,3个重载的submit方法的返回值是Future,可以据此获取任务执行的状态和结果,示...