简述

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

    1.Perl 进程管理Perl 中你可以以不同的方法来创建进程.本教程将讨论一些进程的管理方法. 你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID. %ENV 哈希存放了父进程, ...

  2. 启动Tomcat

    这篇随笔的重点关注启动Tomcat时会用到的两个类,分别是Catalina类 和 Bootstrap类,它们都位于org.apache.catalina.startup包下,Catalina类用于启动 ...

  3. C#中word文档转html

    var path = Request.Url.Host + ":" + Request.Url.Port + list[i].AnnexPath; //html保存路径 strin ...

  4. windows安装npm教程

    1.在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm:  nodejs 下的包管理器. webpack: 它主要用途是通过CommonJS 的语法把所有浏览器端需要发布的静态资源作相应的 ...

  5. luogu题解 P3709 【大爷的字符串题】

    题目链接: https://www.luogu.org/problemnew/show/P3709 思路: 首先我是没读懂题目的,浏览了讨论区的dalao发现才知道就是求区间众数的出现次数. 然后肯定 ...

  6. Facebook 一个热搜帖,美国一个老人癌症不治最后的心愿是跟儿子喝啤酒。

    今天早上起床看到这个Facebook上的热搜帖.太感动了.这个老人癌症不治后最后心愿是跟他的儿子们一起喝一次啤酒.这个帖子被他孙子贴上网以后牵动了千万人的心.

  7. js之常用正则

    //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母, ...

  8. js之数据类型(对象类型——构造器对象——对象)

    JavaScript中除了原始类型,null,undefined之外就是对象了,对象是属性的集合,每个属性都是由键值对(值可以是原始值,比如说是数字,字符串,也可以是对象)构成的.对象又可分为构造器对 ...

  9. webpack中使用html-webpack-plugin生成HTML文件并主动插入css和js引入标签

    html-webpack-plugin clean-webpack-plugin 一.html-webpack-plugin 由于打包时生成的css样式文件和js脚本文件会采用hash值作为文件命名的 ...

  10. 1 sql server 中merge的用法

    MERGE 要更新的表名 AS target USING ( 这里是用什么数据源来跟新 ) AS source ( 这里是数据源的所有列名 ) ON 这里是要更新的表和数据源的匹配条件 WHEN MA ...