Future与FutureTask

 

 

 

一.获取线程执行的结果

很多场景下,我们需要获取线程执行完的结果 。而ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持,如图,3个submit()方法如下,返回的是Future接口。

 

 

 

View Cod 1 public class Test { 2 private static final String SUCCESS = "success";
 3 
 4     public static void main(String[] args) {
 5      //创建线程池
 6         ExecutorService executorService = Executors.newFixedThreadPool(3);
 7 
 8         System.out.println("------------------任务开始执行---------------------");
 9         //executors的submit提交,这里写自己的业务逻辑
10         Future<String> future = executorService.submit(new Callable<String>() {
11             @Override
12             public String call() throws Exception {
13                 Thread.sleep(5000);
14                 System.out.println("submit方法执行任务完成" + "   thread name: " + Thread.currentThread().getName());
15                 return SUCCESS;
16             }
17         });
18         
19         try {//future.get获得线程返回结果
20             String s = future.get();
21             if (SUCCESS.equals(s)) {
22                 String name = Thread.currentThread().getName();
23                 System.out.println("经过返回值比较,submit方法执行任务成功    thread name: " + name);
24             }
25         } catch (InterruptedException e) {
26             e.printStackTrace();
27         } catch (ExecutionException e) {
28             e.printStackTrace();
29         }
30 
31         System.out.println("-------------------结束---------------------");
32     }
33 }

 

执行结果:

1 ------------------任务开始执行---------------------
2 call()调用开始: 1496899867882
3 submit方法执行任务完成: 1496899872897   thread name: pool-1-thread-1
4 经过返回值比较,submit方法执行任务成功    thread name: main
5 -------------------结束---------------------

 

二、FutureTask工具类

FutureTask 实现了 Runnable 和 Future 接口

1.实现了 Runnable 接口,故 FutureTask 对象作为任务提交给 ThreadPoolExecutor 去执行,也可以直接被 Thread 执行;

2.实现了 Future 接口,所以也能用来获得任务的执行结果

 

 

 

举个非常能说明问题的例子:

 

 

首先,我们创建了两个 FutureTask——ft1 和 ft2,ft1 完成洗水壶、烧开水、泡茶的任务,ft2 完成洗茶壶、洗茶杯、拿茶叶的任务;这里需要注意的是 ft1 这个任务在执行泡茶任务前,需要等待 ft2 把茶叶拿来,所以 ft1 内部需要引用 ft2,并在执行泡茶之前,调用 ft2 的 get() 方法实现等待。

具体代码,试试能否写出来?

 

三、什么时候使用Future与FutureTask

           当多个线程并行执行时,当前线程任务依赖前一个线程任务的执行结果,这种问题基本上都可以用 Future 来解决。

posted @ 2020-03-05 21:31  架构之路  阅读(456)  评论(0编辑  收藏  举报
========================================================================== 如果您觉得这篇文章对你有帮助,可以【关注我】或者【点赞】,希望我们一起在架构的路上,并肩齐行 ==========================================================================