zoukankan      html  css  js  c++  java
  • Callable与Future的介绍

       Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。

    Callable的接口定义如下:

    1 public interface Callable<V> { 
    2 
    3       V   call()   throws Exception; 
    4 
    5 } 

    Callable和Runnable的区别如下:

    I    Callable定义的方法是call,而Runnable定义的方法是run。

    II   Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。

    III  Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。  

    Future 介绍

    Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。Future的cancel方法可以取消任务的执行,它有一布尔参数,参数为 true 表示立即中断任务的执行,参数为 false 表示允许正在运行的任务运行完成。Future的 get 方法等待计算完成,获取计算结果

      1 import java.util.concurrent.Callable;
      2 
      3 import java.util.concurrent.ExecutorService;
      4 
      5 import java.util.concurrent.Executors;
      6 
      7 import java.util.concurrent.Future;
      8 
      9 /**
     10 
     11  * Callable 和 Future接口
     12 
     13  * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
     14 
     15  * Callable和Runnable有几点不同:
     16 
     17  * (1)Callable规定的方法是call(),而Runnable规定的方法是run().
     18 
     19  * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
     20 
     21  * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
     22 
     23  * (4)运行Callable任务可拿到一个Future对象,
     24 
     25  * Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
     26 
     27  * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
     28 
     29  */
     30 
     31 public class CallableAndFuture {
     32 
     33     public static class  MyCallable  implements Callable{
     34 
     35           private int flag = 0; 
     36 
     37           public MyCallable(int flag){
     38 
     39                   this.flag = flag;
     40 
     41           }
     42 
     43           public String call() throws Exception{
     44 
     45               if (this.flag == 0){  
     46 
     47                       return "flag = 0";
     48 
     49             } 
     50 
     51             if (this.flag == 1){   
     52 
     53                 try {
     54 
     55                     while (true) {
     56 
     57                             System.out.println("looping.");
     58 
     59                             Thread.sleep(2000);
     60 
     61                     }
     62 
     63                 } catch (InterruptedException e) {
     64 
     65                               System.out.println("Interrupted");
     66 
     67                 }
     68 
     69                 return "false";
     70 
     71             } else {   
     72 
     73                        throw new Exception("Bad flag value!");
     74 
     75             }
     76 
     77         }
     78 
     79     }
     80 
     81     public static void main(String[] args) {
     82 
     83        // 定义3个Callable类型的任务
     84 
     85         MyCallable task1 = new MyCallable(0);
     86 
     87         MyCallable task2 = new MyCallable(1);
     88 
     89         MyCallable task3 = new MyCallable(2);
     90 
     91         
     92 
     93        // 创建一个执行任务的服务
     94 
     95         ExecutorService es = Executors.newFixedThreadPool(3);
     96 
     97         try {
     98 
     99            // 提交并执行任务,任务启动时返回了一个Future对象,
    100 
    101             // 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
    102 
    103             Future future1 = es.submit(task1);
    104 
    105            // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
    106 
    107             System.out.println("task1: " + future1.get());
    108 
    109             
    110 
    111             Future future2 = es.submit(task2);
    112 
    113            // 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
    114 
    115             Thread.sleep(5000);
    116 
    117             System.out.println("task2 cancel: " + future2.cancel(true));
    118 
    119             
    120 
    121            // 获取第三个任务的输出,因为执行第三个任务会引起异常
    122 
    123             // 所以下面的语句将引起异常的抛出
    124 
    125             Future future3 = es.submit(task3);
    126 
    127             System.out.println("task3: " + future3.get());
    128 
    129         } catch (Exception e){
    130 
    131             System.out.println(e.toString());
    132 
    133         }
    134 
    135        // 停止任务执行服务
    136 
    137         es.shutdownNow();
    138 
    139     }
    140 
    141 }
    View Code
  • 相关阅读:
    贝塞尔曲线原理(转载)
    无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll
    HDU 3530 Subsequence(单调队列)
    Gym 100247I Meteor Flow(优先队列)
    BZOJ 1040: [ZJOI2008]骑士(基环树dp)
    Gym 100247C Victor's Research(有多少区间之和为S)
    Gym 100247A The Power of the Dark Side
    Gym 100247B Similar Strings(哈希+思维)
    51nod 1405 树的距离之和(dfs)
    51nod 1378 夹克老爷的愤怒(树型dp+贪心)
  • 原文地址:https://www.cnblogs.com/wq920/p/3507674.html
Copyright © 2011-2022 走看看