`

java线程:关于Callable和Future的简单使用:有返回值的线程

 
阅读更多

 


分类: java_线程 53人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. import java.util.Random;  
  2. import java.util.concurrent.Callable;  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.Future;  
  6.   
  7. /** 
  8.  * 关于Callable和Future的简单使用:有返回值的线程 
  9.  *  
  10.  */   
  11. public class CallableAndFutureTest {  
  12.       
  13.     public static void main(String[] args) {  
  14.           
  15.         // 创建5个固定线程的数量的线程池  
  16.         ExecutorService threadPool = Executors.newFixedThreadPool(5);  
  17.           
  18.         // 提交20个任务对象  
  19.         for(int i = 0; i < 20; i++){  
  20.             Future<String> future = threadPool.submit(new Callable<String>() {  
  21.                 @Override  
  22.                 public String call() throws Exception {  
  23.                     return new Random().nextInt() + "";  
  24.                 }  
  25.             });  
  26.               
  27.             try {  
  28.                 sop(i+ ": " + future.get()); // 获取结果并打印  
  29.             } catch (Exception e) {  
  30.                 // future有可能为null,为了防止空指针异常,有必要做出判断  
  31.                 if( future != null ){  
  32.                     // 抛出异常用,取消任务,并关闭线程池  
  33.                     future.cancel(true);  
  34.                     threadPool.shutdownNow(); // 可选  
  35.                 }  
  36.                 throw new RuntimeException(e);  
  37.             }  
  38.         }  
  39.     }  
  40.       
  41.     private static void sop(Object obj){  
  42.         System.out.println(obj);  
  43.     }  
  44. }  
  45.   
  46. /** 
  47.  * Future: 
  48.  *      Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获 
  49.  *      取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此 
  50.  *      方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消 
  51.  *      了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的 
  52.  *      结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 
  53.  *  
  54.  * Future的体系: 
  55.  *          Future<V> 
  56.  *              |--- RunnableFuture<V> 
  57.  *              |--- ScheduledFuture<V> 
  58.  *                  |--- RunnableScheduledFuture<V> 
  59.  *  
  60.  *      1)RunnableFuture: 
  61.  *          public interface RunnableFuture<V> extends Runnable, Future<V> 
  62.  *          实现了 Runnable 的 Future,成功执行 run 方法可以完成 Future 并允许访问其结果。 
  63.  *       
  64.  *      2)RunnableScheduledFuture: 
  65.  *          public interface RunnableScheduledFuture<V>extends RunnableFuture<V>, ScheduledFuture<V> 
  66.  *       
  67.  *      3)对于Future体系,一般只需要Future就可以满足到需求 
  68.  *  
  69.  * Future中的方法: 
  70.  *      V get(): 
  71.  *          等待任务执行完毕,获取结果,阻塞性的方法; 
  72.  *  
  73.  *      boolean cancel(boolean mayInterruptIfRunning): 
  74.  *          试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel 
  75.  *          时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是 
  76.  *          否应该以试图停止任务的方式来中断执行此任务的线程。  
  77.  *          此方法返回后,对 isDone() 的后续调用将始终返回 true。如果此方法返回 true,则对 isCancelled()的后续调用将始终返 
  78.  *          回 true。 
  79.  * 
  80.  *      boolean isCancelled(): 
  81.  * 
  82.  *      boolean isDone(): 
  83.  * 
  84.  *      V get(long timeout,TimeUnit unit): 
  85.  * 
  86.  *      详细情况请查阅API 
  87.  *       
  88.  */  
分享到:
评论

相关推荐

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    Callable和Future.doc

    Callable和Future详解: Callable和Runnable有几点不同: (1)Callable规定的方法是call(),而Runnable规定的方法是run(); (2)call()方法可抛出异常,而run()方法是不能抛出异常的。 (3)Runnable不会返回结果,...

    java多线程Future和Callable类示例分享

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    \java超强笔记(超级经典)

    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同: Callable规定的方法是call(),而Runnable规定的方法是run(). ...

    Java 实现多线程的几种方式汇总

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

    疯狂JAVA讲义

    学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...

    LeetCode判断字符串是否循环-java:Java

    使用excutors的静态方法创建线程.excute(runnable实现类)/.submit(callable实现类),.shutdown() (3)线程的生命周期:创建,就绪(start),运行(获得cpu资源),阻塞 object的方法:wait(notify,notifyall)...

    线程池ThreadPoolExecutor

    引子 线程的创建和销毁比较消耗资源,... Future submit(Callable task):执行任务,有返回值,一般又来执行Callable void shutdown() :关闭线程池 AbstractExecutorService:基本实现了ExecutorService的所有方法 Th

    javaSE代码实例

    17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 Callable与Future接口的具体使用 385 17.3 资源的封锁 386 17.3.1 Lock接口与ReentrantLock类简介 386 ...

    java核心知识点整理.pdf

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    Python核心编程第二版(ok)

     11.1.2 返回值与函数类型   11.2 调用函数   11.2.1 函数操作符   11.2.2 关键字参数  11.2.3 默认参数   11.2.4 参数组   11.3 创建函数   11.3.1 def语句   11.3.2 声明与定义比较   ...

    Python核心编程第二版

     11.1.2 返回值与函数类型   11.2 调用函数   11.2.1 函数操作符   11.2.2 关键字参数  11.2.3 默认参数   11.2.4 参数组   11.3 创建函数   11.3.1 def语句   11.3.2 声明与定义比较   ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics