Future与FutureTask

 

 

 

一.获取线程执行的结果

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

Future与FutureTask

 

 

 

;
 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 接口,所以也能用来获得任务的执行结果

Future与FutureTask

 

 

 

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

Future与FutureTask

 

 

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

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

 

三、什么时候使用Future与FutureTask

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

相关文章:

  • 2021-06-09
  • 2022-01-06
  • 2021-05-06
  • 2021-07-12
  • 2022-12-23
猜你喜欢
  • 2021-06-02
  • 2021-05-06
  • 2022-01-26
  • 2022-12-23
  • 2021-10-10
相关资源
相似解决方案