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构造函数提供的。

  • 相关阅读:
    20145334赵文豪 《信息安全系统设计基础》第2周学习总结
    20145334赵文豪《信息安全系统设计基础》第1周学习总结
    关于第五周大家学习问题的总结
    20145334 第五次 java 实验报告
    20145334 《Java程序设计》第10周学习总结
    实验四 Android开发基础
    # 20145334 《Java程序设计》第9周学习总结
    20145334实验三《敏捷开发与XP实践》
    实验二:面向对象设计
    程序的机器级表示内容补充及扩展
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959135.html
Copyright © 2011-2022 走看看