简述

在多线程中有时候我们希望一个线程执行完毕后可以返回一些值,在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

翻译: https://www.journaldev.com/1090/java-callable-future-example?utm_source=website&utm_medium=sidebar&utm_campaign=Core-Java-Sidebar-Widget

Java线程之Callable、Future的更多相关文章

  1. Java线程之Callable和Future

    本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果.        Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结 ...

  2. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  3. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  4. java多线程之Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

  5. Java多线程之Callable接口与Runnable的实现以及选择

    通过实现Runnable接口的实现 package Thread; import java.util.concurrent.ExecutorService;import java.util.concu ...

  6. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  7. java 并发runable,callable,future,futureTask

    转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...

  8. Java线程之FutureTask

    简述 FutureTask是Future接口的实现类,并提供了可取消的异步处理的功能,它包含了启动和取消(start and cancel)任务的方法,同时也包含了可以返回FutureTask状态(c ...

  9. Java多线程之Callable接口的实现

    Callable 和 Future接口  Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. Callable和Runn ...

随机推荐

  1. ZROI-Day2比赛解题报告

    ZROIDay2-比赛解题报告 版权原因不提供题面信息 序 这几天作息有点鬼畜,虽然昨晚很晚睡但是早上精神还不错,看到题发现T1很友好?T2woc这暴力都好难打?T3多项式?!这样下去比赛会不会出现更 ...

  2. VS2008提示无法打开包括文件:“afxcontrolbars.h”解决办法

    主要造成这个问题的主要原因是,在打了SP1的VS2008下创建的项目放在没有打SP1的VS2008下就会报错   解决办法: 一.给VS2008打上SP1补丁即可      此方法比较彻底,但是安装较 ...

  3. O063、NFS Volume Provider(Part II)

    参考https://www.cnblogs.com/CloudMan6/p/5693771.html   本节开始创建 NFS volume ,操作方法和 LVM volume一样,唯一的区别是在 v ...

  4. 利用宏方便地书写raw string literals

    以前一直没用过标准库的regex,今天写一个hlsl的解析工具的时候用了一下,发现用字符串字面值写regular expression的时候非常不方便,特别是每个“\”字符都要被识别为转义,只能写成“ ...

  5. 根据返回数据, 迭代数组, 构造HTML结构

    首先需要引入jQuery哈! 1. 要求用下面的格式制作目录, 结构如下: <ul> <li>xxxx</li> <li>xxxx</li> ...

  6. 1.Linux文件及目录结构

    Linux 文件结构 在Linux中 ,一切皆文件 目录结构

  7. win10软件使用指南备忘录

    altrun:http://xbeta.info/altrun.htm timer:https://www.playpcesor.com/2009/04/timer.html (好像要上网打开) do ...

  8. ORALCE 数据库字符串处理、常用函数

    .字符串转日期: to_date(paramStr,'YYYYMMDDHH24MISS') to_date(paramStr,'yyyy-MM-DD') to_date(paramStr,'yyyy/ ...

  9. 基础数据 补充 set() 集合 深浅拷贝

    一  对字符串的操作 li = ["张曼玉", "朱茵", "关之琳", "刘嘉玲"] s = "_" ...

  10. altium designer 鼠线

    第一: 按“L”进入View Configurations 要确保Default Color for New Nets是勾上的. 第二: 如果“PCB”的下拉列表处于“From-To Editor”状 ...