Java Callable接口——有返回值的线程
实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行。《线程等待——CountDownLatch使用》中我们介绍了CountDownLatch的使用,通过使用CountDownLatch,可以实现线程等待。
JDK 1.8实现了一种更好的方式,实现线程等待与获取线程返回值,那就是Callable接口,下面我们来看看具体代码。
package com.coshaho.learn; import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import org.apache.kafka.common.group.Time; public class CallableLearn
{
public static void main(String[] args) throws InterruptedException, ExecutionException
{
long start = System.currentTimeMillis();
MyCallableTask task1 = new MyCallableTask();
MyCallableTask task2 = new MyCallableTask();
MyCallableTask task3 = new MyCallableTask(); // 使用线程池submit方法,可以获取返回值
Future<String> future1 = FIXED_THREADPOOL.submit(task1);
Future<String> future2 = FIXED_THREADPOOL.submit(task2);
Future<String> future3 = FIXED_THREADPOOL.submit(task3);
long end = System.currentTimeMillis(); // 任务提交不会阻塞
System.out.println("Submit task cost " + (end - start) + "ms."); System.out.println("Task1: " + future1.get());
System.out.println("Task2: " + future2.get());
System.out.println("Task3: " + future3.get()); // Future.get方法等待线程返回值
System.out.println("Get task return value cost " + (System.currentTimeMillis() - end) + "ms.");
} // 大小为3的线程池
public final static ExecutorService FIXED_THREADPOOL = Executors.newFixedThreadPool(3); public static class MyCallableTask implements Callable<String>
{
// 睡i秒并返回信息
@Override
public String call() throws Exception
{
Random random = new Random();
int i = random.nextInt(10) * 1000;
Time.sleep(i);
return "Sleep " + i + "ms.";
} } } 结果
Submit task cost 3ms.
Task1: Sleep 5000ms.
Task2: Sleep 8000ms.
Task3: Sleep 8000ms.
Get task return value cost 8659ms.
三个关键点
1、 线程需要实现Callable接口
2、 线程池采用submit方法提交任务,可以获取返回值Future
3、 使用Future.get方法时,会阻塞当前线程,等待任务返回值
Java Callable接口——有返回值的线程的更多相关文章
- Callable接口--有返回值的线程
Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...
- Java中使用有返回值的线程
在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable,可以获取线程中的返回值,但是获取线程的返回值的时候,需 ...
- java使用Callable创建又返回值的线程
并发编程使我们可以将程序分为很多个分离的,相互之间独立的任务,通过使用多线程的机制,将每个任务都会有一个执行线程来单独的驱动,一个线程是 进程中一个单一顺序控制流,一个进程可以拥有多个线程,也就相当于 ...
- java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...
- Java线程中带有返回值的线程Callable
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现C ...
- Java多线程-新特性-有返回值的线程
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现 ...
- Java线程:新特征-有返回值的线程
http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...
- Java线程:新特征-有返回值的线程《转》
原始文章 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. ...
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...
随机推荐
- 用AT命令调试调制解调器
最早生产调制解调器的公司是贺氏,后来组建的厂家制造的调制解调器都与HAYES兼容,大部分的通信软件使用菜单来对调制解调器进行配置.检测.但是有些通信软件要求用户直接发命令给调制解调器,在这种情况下必须 ...
- CentOS 6安装并开启telnet服务
一.安装telnet yum install telnet telnet-server //安装telnet server捎带手把客户端也装了 二.配置xinetd telnet server默认会安 ...
- thinkphp结合layui上传视频
JS示例: <script type="text/javascript"> layui.use(['form', 'layedit','element', 'layda ...
- JavaEE JSP 学习笔记
一.JSP简介 1.也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一.由于原理上是Servlet, 所以JSP/Servlet在一起. 二.HTML.Servlet和JSP 1. ...
- Redis 如何保持和MySQL数据一致
1. MySQL持久化数据,Redis只读数据 redis在启动之后,从数据库加载数据. 读请求: 不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取 写请求: 数据首先都写到数 ...
- opencv学习之PyImageSearch
Practical Python and OpenCV+ Case Studies 是一本opencv的入门书籍 强烈推荐一个老外的网站,pyimagesearch 网址:https://www.py ...
- Bazel构建工具的安装
官方Doc:https://docs.bazel.build/versions/master/install-ubuntu.html 使用Bazel定制的APT存储库 (recommended) 1. ...
- CCCC L2 部落 L3社交集群
https://www.patest.cn/contests/gplt/L2-024 题解:部落是并查集模板题. 社交集群用并查集暴力有23分 坑:写了半天,发现自己并查集没怎么学明白,现在才搞懂: ...
- ionic项目打包好Xcode工程,模拟器运行各种沙盒缓存目录
用ionic开发好的app,build好iOS端可用的Xcode工程,然后用模拟器跑起来.研究一下js写的代码做本地持久化时,不同类型的文件都放在那里了. cordova-plugin-sqliteS ...
- automation轻松“一点”,搞定裸机安装系统
企业在新建数据中心.新业务上线.老业务扩容等场景下,会采购一批新的裸机服务器,在新服务器投入使用之前,势必得进行操作系统的安装.相信每个人都有安装操作系统的经历,BIOS设置.磁盘分区.驱动安装... ...