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 来解决。
==========================================================================
如果您觉得这篇文章对你有帮助,可以【关注我】或者【点赞】,希望我们一起在架构的路上,并肩齐行
==========================================================================
==========================================================================