zoukankan      html  css  js  c++  java
  • 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 来解决。

    ==========================================================================           如果您觉得这篇文章对你有帮助,可以【关注我】或者【点赞】,希望我们一起在架构的路上,并肩齐行
    ==========================================================================
  • 相关阅读:
    /etc/sysconfig/network-scripts/ifcfg-eth0
    虚拟机不能上网
    VMware3种网络模式
    SecureCRT学习之道:用SecureCRT来上传和下载数据
    SecureCRT学习之道:SecureCRT 常用技巧
    SecureCRT学习之道:SecureCRT常用快捷键设置与字体设置方法
    CentOS7 编译安装LNMP
    提高PHP编程效率的方法
    基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台
    Linux系统部署规范v1.0
  • 原文地址:https://www.cnblogs.com/amberJava/p/12422860.html
Copyright © 2011-2022 走看看