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() 创建一个可根据需要创建新线程的线 ...
随机推荐
- ZJU 2676 Network Wars
Network Wars Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
- Image Processing for Very Large Images
The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...
- 字符拆分存入Map计算单词的个数
///计算从命令行输入单词的种类与个数//Map<key,Value>Key-->单词:Value-->数量
- Redis windows版本的启停bat脚本命令
Reids windows版本安装 redis windows官网推荐:https://github.com/MicrosoftArchive/redis/releases 下载解压即可. 启停bat ...
- SQL SERVER-in,between,like
and 1 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式 ( 可以使用正则表达式) select * from [User] where UserName like '%r' -- 以 ...
- 一个HTTP连接是包含两部分的,请求报文和响应报文这俩组合起来才是一次完整的HTTP请求,并不会单独显示请求报文或者响应报文
一个HTTP连接是包含两部分的,请求报文和响应报文这俩组合起来才是一次完整的HTTP请求,并不会单独显示请求报文或者响应报文. 2.注意看,一次HTTP请求,是包括这两部分的
- CoreData 从入门到精通(六)模型版本和数据迁移
前面几篇文章中讲的所有内容,都是在同一个模型版本上进行操作的.但在真实开发中,基本上不会一直停留在一个版本上,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模 ...
- 制作可以SSH的Docker容器
以 Ubuntu 16.04为例: Docker里的root密码是随机的, 用passwd来设置新的密码 安装完SSH_SERVER后, 默认是不能用root登录的. vi /etc/ssh/sshd ...
- 连类比事-category和extension
extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西. extension在编译期决议,它就是类的一部分,在编译期和头文件里的@i ...
- 玩转HTML5移动页面(动效篇)
为一名前端,在拿到设计稿时你有两种选择: 快速输出静态页面 加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些 ...