zoukankan      html  css  js  c++  java
  • Java FutureTask理解

    尊敬原创作者,转载请注明出处:

    http://blog.csdn.net/gemmem/article/details/8956703

    FutureTask是为了弥补Thread的不足而设计的,它可以让程序员准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果(如果有需要)。

    java.util.concurrent 
    类 FutureTask<V>

    java.lang.Object
      java.util.concurrent.FutureTask<V>
    
    类型参数:
    V - 此 FutureTask 的 get 方法所返回的结果类型。
    所有已实现的接口:
    RunnableFuture<V>, RunnableFuture<V>

    public class FutureTask<V>
    extends Objectimplements RunnableFuture<V>
    
    

    可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。

    可使用 FutureTask 包装 Callable 或Runnable 对象。因为FutureTask 实现了Runnable,所以可将FutureTask 提交给 Executor 执行。

    除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。

    这个解释过于全面,没有突出重点,其实重点就在于FutureTask的get()方法。

    先看一个demo:

    [java] view plaincopy
    1. import java.util.concurrent.ExecutionException;    
    2. import java.util.concurrent.ExecutorService;    
    3. import java.util.concurrent.Executors;    
    4. import java.util.concurrent.Future;    
    5. import java.util.concurrent.FutureTask;    
    6. import java.util.concurrent.Callable;    
    7.   
    8. public class Main {    
    9.     /**  
    10.      * @param args  
    11.      */    
    12.     public static void main(String[] args) {  
    13.         MyCall task1 = new MyCall("this is task1");  
    14.         MyCall.Result result = new MyCall.Result();  
    15.         result.setFlag("this is result");    
    16.         ExecutorService pool = Executors.newFixedThreadPool(3);    
    17.         Future f1 = new FutureTask(task1) {    
    18.             @Override    
    19.             protected void done() {    
    20.                 try {    
    21.                       
    22.                     MyCall.Result r = (MyCall.Result) get();  
    23.                       
    24.                     System.out.println(r.getFlag() + " about callable");    
    25.                 } catch (InterruptedException e) {    
    26.                     // TODO Auto-generated catch block    
    27.                     e.printStackTrace();    
    28.                 } catch (ExecutionException e) {    
    29.                     // TODO Auto-generated catch block    
    30.                     e.printStackTrace();    
    31.                 }    
    32.                 super.done();    
    33.             }    
    34.     
    35.         };    
    36.         Future f2 = new FutureTask(new MyRun(),result){    
    37.             @Override    
    38.             protected void done() {    
    39.                 try {    
    40.                       
    41.                     MyCall.Result r = (MyCall.Result) get();    
    42.                       
    43.                     System.out.println(r.getFlag() + " about runnable");    
    44.                 } catch (InterruptedException e) {    
    45.                     // TODO Auto-generated catch block    
    46.                     e.printStackTrace();    
    47.                 } catch (ExecutionException e) {    
    48.                     // TODO Auto-generated catch block    
    49.                     e.printStackTrace();    
    50.                 }    
    51.                 super.done();    
    52.             }    
    53.         };    
    54.         pool.execute((Runnable) f1);    
    55.         pool.execute((Runnable) f2);    
    56.     }    
    57.     
    58. }    
    59.   
    60. class MyCall implements Callable {    
    61.     Result r;    
    62.     String j = "";    
    63.     MyCall() {    
    64.     
    65.     }    
    66.     
    67.     MyCall(String flag) {    
    68.         j = flag;    
    69.     }    
    70.     @Override    
    71.     public Result call() throws Exception {    
    72.         System.out.println("this is MyCall call");    
    73.         r = new Result();    
    74.         r.setFlag(j);    
    75.         return r;    
    76.     }    
    77.     
    78.     public static class Result {    
    79.         private String flag = "";    
    80.     
    81.         public String getFlag() {    
    82.             return flag;    
    83.         }    
    84.     
    85.         public void setFlag(String flag) {    
    86.             this.flag = flag;    
    87.         }    
    88.     }    
    89. }    
    90.   
    91. class MyRun implements Runnable{    
    92.         
    93.     @Override    
    94.     public void run() {    
    95.         System.out.println("this is MyRun run");    
    96.             
    97.     }    
    98.     
    99. }    

    对代码做如下分析:

    pool.execute((Runnable) f1)执行后,会创建一个线程,并执行MyCall的call方法,call方法执行完毕后,f1 实例的done()立即执行,这时候f1实例的get()方法会返回之前call()方法返回的Result实例。

    pool.execute((Runnable) f2)的执行和f1类似,不同的是其中done()中的get()返回的实例是f2构造函数提供的。

  • 相关阅读:
    Brain network involved in autonomic functions 与自主功能相关的大脑网络
    Brief summary of classical components of ERP 事件相关成分(ERP)经典成分小结
    ICA & Percentage Variance Account For (PVAF)
    数据处理中白化Whitening的作用图解分析
    Loadings vs eigenvectors in PCA 主成分分析(PCA)中的负荷和特征向量
    主成分分析(PCA)和独立成分分析(ICA)相关资料
    Sketch of heart and QRS complex 心脏及QRS波群简图
    Brain Network visulation in EEG 脑电网络可视化
    Phase Locking Value (PLV) 神经信号的锁相值
    ubuntu16.04下的一些基本操作笔记
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959135.html
Copyright © 2011-2022 走看看