Callable和Future

它们俩其实挺有意思,在运行的时候各司其职,Callable产生结果Future获取结果

使用步骤如下:

  1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值;
  2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值;
  3. 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程;
  4. 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。

接下来通过一个示例来学习这两个对象的使用:

public class Test {public static void main(String[] args) {CallableThreadTest cts = new CallableThreadTest();// 接收FutureTask<Integer> ft = new FutureTask<>(cts);new Thread(ft, "有返回值的线程").start();for (int i = 0; i < 30; i++) {System.out.println( "main" + " 的循环变量i的值:" + i);}try {System.out.println("子线程的返回值:" + ft.get());} catch (Exception e) {e.printStackTrace();}}
}
class CallableThreadTest implements Callable<Integer> {public Integer call() throws Exception {int i = 0;for (; i < 30; i++) {System.out.println(Thread.currentThread().getName() + " " + i);}return i;}
}

运行这段程序你应该可以获取到类似如下结果(每次运行的结果不一致): ... ... main 的循环变量i的值:28 main 的循环变量i的值:29 有返回值的线程 23 有返回值的线程 24 有返回值的线程 25 有返回值的线程 26 有返回值的线程 27 有返回值的线程 28 有返回值的线程 29 子线程的返回值:30

由于输出过长,省略了部分结果,可以发现在最后接收到了子线程的返回值。

在实现Callable接口中,此时不再是run()方法了,而是call()方法,此call()方法作为线程执行体,同时还具有返回值!

细心的你会发现这个结果是call函数的返回值,怎么拿到这个返回值的呢?是通过FutureTask拿到的,使用ft.get()方法即可获得线程的返回值,这就是一个简单的使用Callable和Future的过程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现人脸识别源码【含测试效果图】——DaoImpl层(BaseDaoUtilImpl)

/*** */ package org.dao.impl;import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import org.dao.BaseDao; import org.entity.Users; import org.junit.Test;/*** * * 项目名称&#xff1a;test_BaseDao …

90 % Java 程序员被误导的一个性能优化策略

转载自 90 % Java 程序员被误导的一个性能优化策略 我们经常看到一些 Java 性能优化的书或者理念&#xff0c;说不要在循环内定义变量&#xff0c;这样会占用过多的内存影响性能&#xff0c;而要在循环外面定义。接触 Java 这么久以来&#xff0c;相信很多 Java 程序员都被这…

微软开源Visual Studio测试平台VSTest

IT之家1月21日消息 微软在MSDN博客上宣布&#xff0c;开源旗下Visual Studio测试平台VSTest。这一平台是具备高扩展性的单元测试执行框架&#xff0c;能够在不同的核心之间实现并行化&#xff0c;提供进程隔离&#xff0c;并能够整合进Visual Studio。 目前&#xff0c;VSTest能…

nacos 读取纯数字字符 出错 @value

ums: baseUrl: http://xxxx/xx/Api code: 00972315 纯数字要加单引号

java实现人脸识别源码【含测试效果图】——DaoImpl层(UserDaoImpl)

/** * Title: UserDaoImpl.java * Package org.dao.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:52:58 * version V1.0 */ package org.dao.impl;import org.dao.IUserDao; import org.entity.Use…

线程的状态与调度

当我们使用new关键字新建一个线程&#xff0c;这个时候线程就进入了新建状态&#xff08;New&#xff09;&#xff0c;也就是图中未启动状态&#xff1b;调用start方法启动线程&#xff0c;这个时候就进入了可运行状态&#xff0c;也就是就绪状态&#xff08;Runnable&#xff…

深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

转载自 深入JVM系列&#xff08;三&#xff09;之类加载、类加载器、双亲委派机制与常见问题 一&#xff0e;概述 定义&#xff1a;虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java…

Fabio 安装和简单使用

Fabio&#xff08;Go 语言&#xff09;&#xff1a;https://github.com/eBay/fabio Fabio 是一个快速、现代、zero-conf 负载均衡 HTTP(S) 路由器&#xff0c;用于部署 Consul 管理的微服务。 Fabio 由 eBay Classifieds Group 开发&#xff0c;用于处理 marktplaats.nl 和 kij…

java实现人脸识别源码【含测试效果图】——Service层(IUserService)

/** * Title: BaseService.java * Package org.service * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:48:52 * version V1.0 */ package org.service;import org.entity.Users;/** * * 项目名称&am…

join()

join函数的定义是指&#xff1a;等待线程终止。 我们在运行线程的时候可能会遇到&#xff0c;在主线程中运行子线程&#xff0c;主线程需要获取子线程最终执行结果的情况。 但是有很多时候子线程进行了很多耗时的操作&#xff0c;主线程往往先于子线程结束&#xff0c;这个时…

计算密集型分布式内存存储和运算平台架构

1. 相关概念 1.1 内存数据库 关系型数据库处理永久、稳定的数据&#xff0c;内存数据库就是将其数据放在内存中&#xff0c;活动事务只与内存数据打交道&#xff0c;重新设计了体系结构并且在数据缓存、快速算法、并行操作方面也进行了相应的改进&#xff0c;所以数据处理速度比…

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式 哈斗 2021-02-20 10:03:36 2034 收藏 6 分类专栏&#xff1a; java 文章标签&#xff1a; java 时间格式转换 版权 由于在项目中遇到此时间格式需要转换的问题&#xff0c;所以在此记录下转换…

java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)

/** * Title: BaseServiceImpl.java * Package org.service.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:50:26 * version V1.0 */ package org.service.impl;import org.dao.IUserDao; import or…

如何解决线程安全问题

如何解决线程安全问题 怎么解决线程的安全问题呢&#xff1f; 基本上所有解决线程安全问题的方式都是采用“序列化临界资源访问”的方式&#xff0c;即在同一时刻只有一个线程操作临界资源&#xff0c;操作完了才能让其他线程进行操作&#xff0c;也称作同步互斥访问。 在Ja…

【深入Java虚拟机】之四:类加载机制

转载自 【深入Java虚拟机】之四&#xff1a;类加载机制 类加载过程 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示&#xff1a; 其中…

给职场新人的建议

给职场新人的建议 这里给职场新人的10点建议 1.不要有为老板工作的心态 这个和为了老师或者为了父母学习一样搞笑&#xff0c;你是为了自己工作&#xff0c;学到的本事&#xff0c;得到的经验&#xff0c;你离开公司你就带走了&#xff0c;老板留不下你的肉体&#xff0c;也…

违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

转载自 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制 前言&#xff1a; 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上&#xff0c;进而分析这种思想如何应用到Tomcat这个web容器中&#xff0c;从源码的角度对 违…

Lock

lock接口 Lock lock ...; lock.lock(); try{//处理任务 }catch(Exception ex){ }finally{lock.unlock(); //释放锁 }经常这样使用 Lock lock ...; if(lock.tryLock()) {try{//处理任务}catch(Exception ex){}finally{lock.unlock(); //释放锁} }else {//如果不能获取锁…

红包的技术升级之旅

鸡年春节&#xff0c;红包再次成为年味儿最重要的催化剂。先是腾讯QQ钱包推出“LBSAR天降红包”等三种创新有趣的玩法&#xff0c;支付宝上线AR实景红包&#xff0c;微博亦推出视频红包等形式。虽然微信退出红包营销让人稍有意外&#xff0c;但用户对红包的热情仍未消减。 事实…

java中生成1000~10000之间的随机数

要生成在[min,max]之间的随机整数&#xff0c;可使用Random类进行相关运算&#xff1a; Random random new Random(); int s random.nextInt(max)%(max-min1) min; random.nextInt(max)表示生成[0,max]之间的随机数&#xff0c;然后对(max-min1)取模。 以生成[1000,10000]…