默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便。jdk1.5中可以使用Future 和 Callable 来获取线程返回值

Callable 可以 看成与 Runnable 一样的但是有返回值的接口。

Callable接口的call()方法有返回值,而Runnable接口的run方法没有返回值;

Callable接口的call()方法可以声明抛出异常,而Runnable接口的run方法不可以声明抛出异常。

执行完Callable接口中的任务后,返回值是通过Future接口进行获取的。

看例子:

     final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
ExecutorService executorService = Executors.newCachedThreadPool();
// ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> futureList = new ArrayList<Future<String>>();
// 此线程池运行5个线程
for (int i = 0; i < 5; i++) {
final int index = i;
// 使用 submit 方法 和 execute 方法的区别是,execute 方法没有返回值,而 submit 方法有返回值。
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("Thread-" + index + "-begin-" + sf.format(new Date()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + "-end-" + sf.format(new Date()));
return "index-" + index;
} });
futureList.add(future);
}
// future.get() 是阻塞执行的,所以获取值要在线程都启动之后,再获取
for (Future<String> future : futureList) {
try {
System.out.println(future.get()); // 获取线程返回值
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}

ExecutorService 的 submit 方法 和 execute 方法的区别是,

  execute 方法没有返回值,不能直接捕获异常,但可以通过自定义ThreadFactory的方式捕获异常;

  submit 方法有返回值,可以直接使用 catch Execution-Exception捕获异常。

Future 的常用api:

get()    获取线程返回值,阻塞执行

get(long timeout, TimeUnit unit)    获取线程返回值(有超时时间),阻塞执行
cancel(boolean mayInterruptIfRunning)    取消执行,入参为true表示,如果线程正在运行则中断执行;为false表示,如果线程没有在运行才中断继续执行;返回值表示取消执行命令是否成功完成
isCancelled()    是否已取消执行
isDone()    如果完成此任务,则返回true。完成可能是由于正常终止、异常或取消——在所有这些情况下,此方法将返回true。

【Java并发核心五】Future 和 Callable的更多相关文章

  1. 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser

    个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...

  2. 和朱晔一起复习Java并发(五):并发容器和同步器

    本节我们先会来复习一下java.util.concurrent下面的一些并发容器,然后再会来简单看一下各种同步器. ConcurrentHashMap和ConcurrentSkipListMap的性能 ...

  3. Java并发机制(9)--Callable、Future、FutureTask的使用

    Java并发编程:Callable.Future.FutureTask的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3949310.html ...

  4. 【java并发核心一】Semaphore 的使用思路

    最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记 ...

  5. Java并发(五):synchronized实现原理

    一.synchronized用法 Java中的同步块用synchronized标记. 同步块在Java中是同步在某个对象上(监视器对象). 所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操 ...

  6. 【Java并发编程五】信号量

    一.概述 技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据.计数信号量可以用来实现资源池或者给一个容器限定边界. 信号量维护了一个许可集,许可的初始量通过构造函数传 ...

  7. 【Java并发核心七】计划任务ScheduleExecutorService

    Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutor ...

  8. 【Java并发核心九】并发集合框架

    1.List接口:ArrayList 和 Vector ArrayList不是线程安全的,Vector是线程安全的,Vector有一个子类,可实现后进先出(LIFO)的对象堆栈(LinkedList ...

  9. Java并发(五)线程池使用番外-分析RejectedExecutionException异常

    目录 一.入门示例 二.异常场景1 三.异常场景2 四.解决方法 之前在使用线程池的时候,出现了 java.util.concurrent.RejectedExecutionException ,原因 ...

随机推荐

  1. 2018-2019-2 网络对抗技术 20165227 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165227 Exp4 恶意代码分析 实验步骤: 使用的设备:Win7(虚拟机).kali(虚拟机) 实验一:使用如计划任务,每隔一分钟记录自己的电脑有哪些程 ...

  2. 【转】Python之装饰器

    [转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...

  3. python标准库之secrets

    secrets secrets是python3.6加入到标准库的,使用secrets模块,可以生成适用于处理机密信息(如密码,帐户身份验证,安全令牌)的加密强随机数. 导入 import secret ...

  4. BootStrap学习从现在开始

    前言 原文链接 http://aehyok.com/Blog/Detail/6.html 当下最流行的前端开发框架Bootstrap,可大大简化网站开发过程,从而深受广大开发者的喜欢.本文总结了Boo ...

  5. SpringMVC_HelloWorld_02

    一.新建项目 同SpringMVC_HelloWorld_01 二.配置文件 1.配置web.xml <?xml version="1.0" encoding="U ...

  6. React-Native 之 项目实战(一)

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...

  7. 802.11 af 要点

    (1)TVWS工作在 VHF/UHF 频段,欧洲为 470-790MHZ, 美国为 54-698MHZ. (2)GDB(Geolocation Database):地理位置数据库,与其他802.11协 ...

  8. 每天一个linux命令:scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  9. PYTHON-UDP

    1.TCP 和 UDP 发送数据时的流程 ***** 解释 为何TCP是可靠的 是因为发送数据后必须收到确认包 2. UDP的模板代码 ***** 1.UDP协议: (数据报协议) 特点: 无连接 优 ...

  10. css怎么让页面上的内容不能被选中

    body{     -webkit-user-select:none;     -moz-user-select:none;     -ms-user-select:none;     user-se ...