使用CompletablFuture获得不同的结果(异步和同步)

时间:2019-07-10 07:06:37

标签: java asynchronous fork-join forkjoinpool

public static void main(String[] args) throws ExecutionException, InterruptedException {
    long start = System.currentTimeMillis();

    CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{
        System.out.println("first----"+Thread.currentThread().getName());   

         try {
            TimeUnit.SECONDS.sleep(2); //  comment the code 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello";
    }).thenApply(s->{
        System.out.println("second----"+Thread.currentThread().getName());
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return s+"World";
    }).thenApply(a->{
        System.out.println("third----"+Thread.currentThread().getName());
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return a.toUpperCase();
    });

    System.out.println("time:"+(System.currentTimeMillis()-start)/1000);
    System.out.println("result:"+future.get());
}

在不对此代码发表评论之前,我将按以下方式运行结果。 enter image description here

可以看出该程序是异步执行的,但是注释该代码后,结果发生了很大变化。该程序有时是异步的,有时是同步的,并且每个apply模块使用的线程。 enter image description here

enter image description here enter image description here

会有所不同。是什么原因?

0 个答案:

没有答案