http://blog.csdn.net/pipisorry/article/details/44341579

java并发工具类,主要使用的:CountDownLatch、CyclicBarrier、Semaphore、Exchanger。

Introduction

Callable接口代表一段可以调用并返回结果的代码;

Future接口表示异步任务,是还没有完成的任务给出的未来结果。

所以Callable用于产生结果,Future用于获取结果。

Callable接口:Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。Callable接口使用泛型去定义它的返回类型。

Executors类:提供了一些有用的方法在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。

Future对象:java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

Callable接口的源码:

    public interface Callable<V> {  V call() throws Exception; // 计算结果  }

Future接口的源码:

    public interface Future<V> {  boolean  cancel(boolean mayInterruptIfRunning);// 试图取消对此任务的执行  boolean  isCancelled();      // 如果在任务正常完成前将其取消,则返回 true  boolean  isDone();           // 如果任务已完成,则返回 true  V  get() throws InterruptedException, ExecutionException; // 如有必要,等待计算完成,然后获取其结果  // 如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。  V  get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;  }  

一个例子

private ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
     try {Callable<TopicModel> callable = new TopicModelCallable(corpus,param);Future<TopicModel> future = executor.submit(callable);futureList.add(future);} catch (Exception ex) {ex.printStackTrace();}
         for (Future<TopicModel> future : futureList) {TopicModel topicModel = future.get();topicModelList.add(topicModel);}

Note:

1. 用语料和对应参数创建可调用对象callable, 提交给executor并行执行, 结果保存在future对象中,最后可以用future对象的get()方法提取执行结果

2. ExcutorService接口

ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。

主要函数:

<T> Future<T> submit(Callable<T> task)提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造。注:Executors 类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,例如,将 PrivilegedAction 转换为 Callable 形式,这样就可以提交它们了。参数:task - 要提交的任务 返回:表示任务等待完成的 Future 抛出:RejectedExecutionException - 如果任务无法安排执行 NullPointerException - 如果该任务为 null
注意:关于submit的使用和Callable可以参阅《使用Callable返回结果》

[java中Executor、ExecutorService、ThreadPoolExecutor介绍]

from:http://blog.csdn.net/pipisorry/article/details/44341579

ref:http://blog.csdn.net/mazhimazh/article/details/19291965

[如何管理Java线程池及搭建分布式Hadoop调度框架]

Java - 多线程Callable、Executors、Future相关推荐

  1. Java多线程-Callable和Future

    Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需 ...

  2. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  3. Java多线程Callable接口

    Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.  这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.  如 ...

  4. Java中Callable和Future

    Java中为什么需要Callable 在java中有两种创建线程的方法: 一种是继承Thread类,重写run方法: public class TestMain {public static void ...

  5. java 多线程Callable和Runable执行顺序问题详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt125 毫无疑问 Runnable会进行异步执行,此处不多说,主要说明Call ...

  6. java多线程都有几种方式实现

    有三种:     (1)继承Thread类,重写run函数         创建: [java] view plaincopy <span style="font-size:12px; ...

  7. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  8. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  9. Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁 ...

  10. 【头歌实训】Java高级特性 - 多线程基础(1)使用线程,使用 Callable 和 Future 创建线程

    任务描述 本关任务:通过 Callable 和 Future 来创建线程. 相关知识 从Java1.5版本开始,就提供了 Callable 和 Future 来创建线程,这种方式也是在Java程序员面 ...

最新文章

  1. linux rpm找不到命令_linux环境下 python环境import找不到自定义的模块
  2. 优化CSS在网页中的加载方式
  3. mysql每秒支持多少并发_如何设计一个高并发系统?
  4. unity3d Sentinel key not found (H0007)解决方法
  5. 全网唯一的Microsoft?NETFramework3?5SP1简体中文完整版离线安装包安装netframewo
  6. Hadoop自带的一些程序示例
  7. python字典赋值方法_python如何给字典的键对应的值为字典项的字典赋值
  8. ASP中巧用Response属性
  9. spark运行wordcount
  10. JAVA 编码格式转换工具类
  11. GF4各波段太阳辐照度
  12. Linux 实现与宿主机共享文件夹 Centos7
  13. 会计计算机,什么是好的计算机会计软件?
  14. 常见面试算法题汇总(Android面试)
  15. 聚类分析通俗易懂解释
  16. 武汉市公积金提取流程
  17. 安卓iccid_普通人也可以做码农?安卓手机上这些代码你也可以用
  18. ISO 认证是哪三个?
  19. Windows操作系统基础
  20. 2012服务器系统设,server2012服务器安装及设置

热门文章

  1. EF安装和更新数据库
  2. Java集合ArrayList的应用
  3. 在ECSHOP模板商品列表页 显示商品的评论等级和评论数量
  4. blog转到CNBlog了
  5. PaddlePaddle(2)——数据获取与处理(以CV任务为主)
  6. ExtJs + Struts2 + JSON 程序总结
  7. 为什么有人不喜欢标准成本
  8. Factorization Mechanism
  9. 【NeurIPS2020】之预训练语言模型压缩
  10. 收藏 | NLP论文、代码、博客、视频资源(LSTM,指针模型,Attention, ELMo,GPT,BERT、多任务学习等)...