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

    xiaoxiao2022-06-30  114

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

     

    1.Future<V>接口

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

    源码

     

    测试代码

    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<Future> 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要好很多!


    最新回复(0)