Java线程之Callable、Future

简述
在多线程中有时候我们希望一个线程执行完毕后可以返回一些值,在java5中引入了java.util.concurrent.Callable接口,它类似于Runnable接口,但是Callable可以有返回值。
Java Callable接口使用通用定义对象的返回类型,executor类提供了在线程池中执行Java调用的有用方法,由于可调用任务并行运行,所以我们必须等待返回的对象。
Future
实现接口Callable的任务返回的是java.util.concurrent.Future对象,使用Future对象我们可以获得返回值
#取消任务的运行
#如果任务已经完成或已经被取消或因某种原因不能被取消,当调用该方法时会失败
#如果任务还没启动,调用该方法后,该任务将永远不会执行
#如果任务已经启动,如果参数mayInterruptIfRunning为ture,将会中断任务,否则会允许任务执行完成
boolean cancel(boolean mayInterruptIfRunning);
#判断任务是否已经取消
boolean isCancelled();
#判断任务是否执行完成
boolean isDone();
#等待获取任务执行完成后的返回值
V get() throws InterruptedException, ExecutionException;
#在指定时间内等待任务完成并获取返回值,否则抛出超时异常
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
事例
下面是一个简单的Callable调用任务示例,它返回在一秒钟后执行任务的线程的名称,我们使用Executor框架来并行执行100个任务,并使用Java Future来获得提交的任务的结果。
package com.lkf.mulithread;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(1000);
//返回当前线程名字
return Thread.currentThread().getName();
}
public static void main(String args[]){
//使用Executors创建一个固定大小的线程池,线程池大小为10
ExecutorService executor = Executors.newFixedThreadPool(10);
//创建一个列表来保存与Callable相关的Future对象
List<Future<String>> list = new ArrayList<Future<String>>();
//创建 MyCallable 实例
Callable<String> callable = new MyCallable();
for(int i=0; i< 100; i++){
//提交任务到线程池
Future<String> future = executor.submit(callable);
//将返回值放入集合
list.add(future);
}
for(Future<String> fut : list){
try {
//打印返回值,注意这时会有延时,因为Future.get()要等待任务完成
System.out.println(new Date()+ "::"+fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
//关闭线程池
executor.shutdown();
}
}
当我们运行上边的代码,你会发现输出会有延时,那是因为Future get()方法需要等待任务执行完成。同时我们注意到,每次只有10个线程在执行任务。
输出结果:
Sun Mar 25 14:09:50 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:51 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:52 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:53 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:54 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:55 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:56 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:57 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:58 CST 2018::pool-1-thread-7
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-6
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-2
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-9
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-4
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-5
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-8
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-10
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-1
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-3
Sun Mar 25 14:09:59 CST 2018::pool-1-thread-6
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-2
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-9
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-7
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-4
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-5
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-10
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-8
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-3
Sun Mar 25 14:10:00 CST 2018::pool-1-thread-1
Java线程之Callable、Future的更多相关文章
- Java线程之Callable和Future
本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结 ...
- Java线程之 InterruptedException 异常
Java线程之 InterruptedException 异常 当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- java多线程之Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- Java多线程之Callable接口与Runnable的实现以及选择
通过实现Runnable接口的实现 package Thread; import java.util.concurrent.ExecutorService;import java.util.concu ...
- Java线程之CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...
- java 并发runable,callable,future,futureTask
转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...
- Java线程之FutureTask
简述 FutureTask是Future接口的实现类,并提供了可取消的异步处理的功能,它包含了启动和取消(start and cancel)任务的方法,同时也包含了可以返回FutureTask状态(c ...
- Java多线程之Callable接口的实现
Callable 和 Future接口 Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. Callable和Runn ...
随机推荐
- 使用JavaScript和React编写原生移动应用
使用JavaScript和React编写原生移动应用 React Native使你只使用JavaScript也能编写原生移动应用. 它在设计原理上和React一致,通过声明式的组件机制来搭建丰富多彩的 ...
- Struts框架的使用初步
Struts框架的使用初步: A:Apache下载struts.2.1.8.rar包. B:解压空工程,进入apps目录. C:将struts2的基本jar包拷到工程的lib目录中. D:配置web. ...
- 如何使用Navicat 创建一个SqlServer定时任务
因为网上资料不全,所以自己琢磨了一上午,终于弄出来了,记录一下. step1: 右击[函数]选择[新建函数]添加一个存储过程 step2: 选择[过程],点击下一步直至完成,然后编辑存储过程,保存 s ...
- 一个小时前,美国主流媒体,头条,谷歌两位创始人突然宣布退下来,把万亿美元的帝国交给Sundar Pichai
一个小时前,美国各大主流媒体头条,谷歌两位创始人,放弃了万亿美元的帝国控制权,交给了CEO Sundar Pichai.
- VUE生产环境打包build
1.进入到项目根目录执行 npm run build 此时会自动打包在dist目录下 2.安装服务 npm install -g serve 3.启动 serve dist 总结: 以上就是生产环境 ...
- 5.Linux 软件安装管理
1.RPM包安装 (RPM会有依赖性,即安装这个包之前,需要安装某个包) 查询已安装的rpm 列表 rpm -qa | grep xx 安装rpm包 rpm -ivh rpm 包名 -i ...
- MySQL授权远程用户登录权限
1 举例子,建数据库,然后 赋予用户远程访问的所有权限,最后刷新权限 create database cmf DEFAULT CHARACTER SET utf8; grant all on cmf. ...
- XML基础介绍【二】
XML基础介绍[二] 1.schema约束dtd语法: <!ELEMENT 元素名称 约束>schema符合xml的语法,xml语句.一个xml中可以有多个schema,多个schema使 ...
- resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致
1.1.1.1. 步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启 其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...
- Redis04——Redis常见语法
Redis语法 1.string select db 选择数据库(0-20) set k v 设置一个数据 set k1 v nx nx仅仅可以新建的时候进行插入数据 set k2 v xx xx仅仅 ...