如何在java中获取线程异步执行之后的结果

java中提供了Future接口和实现了Future接口的FutureTask 类来将线程执行之后的结果返回(通过get()方法)。

 

1.Future接口

Runnable接口执行任务是不返回任何值的,Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的,这是Runnable跟Future的区别之一,它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法,而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值,该方法会一直阻塞直到任务的结果出来为止,我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。

源码
如何在java中获取线程异步执行之后的结果_第1张图片

 

测试代码

package com.juctest.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author mingxiong.tang
 * @Date: 2019/5/21 16:08
 */
public class TestFuture {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newScheduledThreadPool(5);
        List list=new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Future result1 = executor.submit( new Callable() {
                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    Thread.sleep( 1000 );
                    System.out.println(sum+"22222222222222"+Thread.currentThread().getName());
                    return sum;
                }

            });
            list.add( result1 );
        }


        for(Future f: list){
            f.get();
        }


        Future result2 = executor.submit(new Callable() {

            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 10; i < 100; i++) {
                    sum += i;
                }
                System.out.println(sum+"1111111111"+Thread.currentThread().getName());
                return sum;
            }

        });
//        executor.shutdown();

        System.out.println(result2.get());

        for (int i = 0; i < 10; i++) {
            Future result1 = executor.submit( new Callable() {
                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    Thread.sleep( 1000 );
                    System.out.println(sum+"333333"+Thread.currentThread().getName());
                    return sum;
                }

            });

        }

        executor.shutdown();

        System.out.println(result2.get());

    }


}

 

总结:

线程异步后阻塞等待返回值。相比 计数器减1 和currentluatch每做完一个计数器减1要好很多!

你可能感兴趣的:(java)