Java - 多线程Callable、Executors、Future
http://blog.csdn.net/pipisorry/article/details/44341579
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 - 多线程Callable、Executors、Future的更多相关文章
- Java多线程Callable和Future类详解
public interface Callable<V> 返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法 public in ...
- Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...
- Java多线程-Callable的Future返回值的使用
一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor { void execute(Runnable comm ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- java并发--Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...
- Java Callable Future Example(java 关于Callable,Future的例子)
Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...
- java 多线程 Callable中的futrue模式
java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看. 何为future模式? future模式有点类似于商品订单.在网上购物时 ...
- JAVA 多线程 Callable 与 FutureTask:有返回值的多线程
java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...
- java多线程之 Executors线程池管理
1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...
随机推荐
- JavaScript中的“闭包”
什么是JavaScript中的“闭包”?举一个例子. 闭包是一个内部函数,它可以访问外部(封闭)函数的作用域链中的变量.闭包可以访问三个范围内的变量;具体来说: (1)变量在其自己的范围内, (2)封 ...
- java源码之HashMap和HashTable的异同
代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从 ...
- win7创建webdav
环境 win7+iis 构筑条件 存放路径:c:\Data 访问方式:192.168.x.xxx/webdav 用户名:yx 密码:yx 搭建顺序 1.添加iis.启动->控制面板->程序 ...
- JavaFX学习之道:JavaFX之TableView
TableView表 TableColumn列 构建一个表主要有TableView,TableColumn,ObservableList,Bean. 加入列table.getColumns ...
- 模式匹配的KMP 算法
常见的字符串匹配时,模式串长度为n,源串长度为m,则从头匹配,两个指针i指向源串,j指向模式串,如遇到不同则回溯使j=0,这样就要反复匹配会使效率变低. 因为在如今i之前 的模式串与匹配串的匹配是同样 ...
- linux定时备份mysql数据库文件
1.设定定时器:终端敲入:crontab -e命令 2,然后写入 00 23 * * * /home/db_bak_file/dbbak.sh >>/home/db_bak_fil ...
- bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)
1082: [SCOI2005]栅栏 题目:传送门 题解: 是不是一开始在想DP?本蒟蒻也是qwq,结果很nice的错了ORZ 正解:二分+搜索 我们可以先把两种木材都进行排序,那么如果需要的最大木材 ...
- ThinkPHP新建控制器
ThinkPHP新建控制器 一.效果图 二.步骤 1.新建控制器文件 2.编写控制器文件 3.访问控制器 三.注意事项
- composer是什么
composer是什么 Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 &q ...
- iOS开发-Tools-CocoaPods
CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...