FutureTask的使用示例

2023-05-16

今天看书,有关于 FutureTask 的介绍,感觉还蛮有意思的,可以用它来做一些比较花时间的事情。下面打个通俗的比方来说明一下它的用处:

比如,早上一大早的去公交站台等公交,但那该死的公交20分钟才一班。如果一直死等公交,那么这20分钟无疑就被浪费了。我们可以利用这20分钟,去买个韭菜饼,再买一盒豆浆,然后一边吃一边等。这样就明显提高了时间的利用率。

 

下面给出一个段简单的代码来说明一下它的使用:

 

public class Preloader {

	private final FutureTask<Long> future = new FutureTask<Long>(new Callable<Long>() {
		@Override
		public Long call() throws Exception {
			Thread.currentThread().setName("Thread(3)");

			System.out.println(Thread.currentThread().getName() + ": simulate a latency ");
			try {
				Thread.sleep(5000);
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + ": the latency is over");
			return Math.round(Math.random() * 1000);
		}
	});

	private final Thread loader = new Thread(future);

	public void start() {
		System.out.println(Thread.currentThread().getName() + ": start the loader");
		loader.start();
		System.out.println(Thread.currentThread().getName() + ": loader started");
	}

	public Long get() {
		try {
			System.out.println(Thread.currentThread().getName() + ": begin to get");
			long start = System.currentTimeMillis();
			Long result = future.get();
			System.out.println(Thread.currentThread().getName() + ": got result: " + result);
			System.out.println(Thread.currentThread().getName() + ": spent time: "
					+ (System.currentTimeMillis() - start));
			return result;
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": got nothing");
		return null;
	}

	public static void main(String[] args) {
		Thread.currentThread().setName("Thread(main)");
		final Preloader pl = new Preloader();
		pl.start();

		// try to get the result before the latency is over
		new Thread(new Runnable() {
			@Override
			public void run() {
				Thread.currentThread().setName("Thread(1)");
				pl.get();
			}
		}).start();

		// try to get the result after the latency is over
		new Thread(new Runnable() {
			@Override
			public void run() {
				Thread.currentThread().setName("Thread(2)");
				try {
					Thread.sleep(6000);
					pl.get();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
}

 以上代码的运行结果为:

 

 


main: start the loader
main: loader started
Thread(3): simulate a latency 
Thread(1): begin to get
Thread(3): the latency is over
Thread(1): got result: 917
Thread(1): spent time: 5006
Thread(2): begin to get
Thread(2): got result: 917
Thread(2): spent time: 0  

 通过上面运行的结果,我们可以得到以下结论:

 

① 在FutureTask执行完了之前(即call执行完了之前),去进行get的话,将被会一直阻塞至FutureTask执行完了才会返回。

② FutureTask执行完了之后,再调用get的话,会立刻返回相应的结果

③ FutureTask只会执行一次,所以,多次调用get方法,返回的值始终是一样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FutureTask的使用示例 的相关文章

  • C/C++获取路径下所有文件及其子目录的文件名

    一 功能描述 需要提取某个文件夹下所有文件名字 xff0c 当包含子目录时 xff0c 将子目录及其路径获取到 二 实现方式 使用C语言的opendir函数 DIR span class token operator span dp spa
  • C/C++删除目录文件夹下所有文件(递归)

    一 问题 想要删除目录文件夹 xff0c 类似于rm r的操作 方式1 xff1a 可以使用system直接执行rm r的指令 xff0c system 34 rm r 34 方式2 xff1a 通过C语言内置的函数remove和rmdir
  • Git GUI 的使用

    权限校验 首先 xff0c 服务器需要身份识别 一段RSA加密字符串 启动GUI xff0c 菜单 帮助 Step1 创建密钥 Generate SSH KEY Step2 添加密钥 去你的代码托管服务器 xff0c 你的账号设置中 xff

随机推荐

  • 推荐系统遇上深度学习(九)--评价指标AUC原理及实践

    欢迎关注天善智能 xff0c 我们是专注于商业智能BI xff0c 人工智能AI xff0c 大数据分析与挖掘领域的垂直社区 xff0c 学习 xff0c 问答 求职一站式搞定 xff01 对商业智能BI 大数据分析挖掘 机器学习 xff0
  • VR版“半条命”大火,VR游戏迎来消费级市场的春天?

    彼之砒霜 xff0c 汝之蜜糖 2020年的艰难开局 xff0c 在让众多行业陷入困顿之际 xff0c 却让游戏业迎来了一场流量的盛宴 除了日进斗金的王者 吃鸡 xff0c 还有火爆朋友圈的动森 xff0c 一款3A级VR游戏 Half L
  • 读懂海尔智家大脑:深度体验的本质是深度生活

    了解科技行业的读者 xff0c 应该都对 大脑 这个名词不陌生 黑灯工厂 里指挥生产的 工业大脑 xff0c 繁忙机场里运筹帷幄的 航空大脑 xff0c 还有智慧城市建设的灵魂 城市大脑 如果家也有一颗总揽全局的大脑 xff0c 生活会发生
  • FreeRTOS内核实现05:支持多优先级

    目录 1 支持多优先级的方法 1 1 任务优先级 1 2 基于优先级的就绪列表 1 3 实现基于优先级的调度 2 查找最高优先级就绪任务的方法 2 1 通用方法 2 2 体系结构优化方法 3 修改代码支持多优先级 3 1 创建任务相关 3
  • 无人机和激光雷达,会是一对好cp吗?

    占据一辆无人驾驶汽车成本40 的激光雷达 xff0c 以精准和无死角的空间探测能力 xff0c 成为是无人驾驶领域不可或缺的存在 但和汽车相比 xff0c 似乎激光雷达在无人机上更有用武之地 xff1a 成像精度要求不高 行动自由范围大 成
  • Html文件读取与爬取(个人笔记篇)

    Html文件读取与爬取 xff08 个人笔记篇 xff09 文章目录 Html文件读取与爬取 xff08 个人笔记篇 xff09 html文件读取解析html数据存储爬取到的数据完整代码展示 html文件读取 1 通过open xff1a
  • ubuntu 安装包报:下列软件包有未满足的依赖关系:

    root 64 ubuntu usr src linux 5 0 1 apt install zlib1g dev 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有一些软件包无法被安装 如果您用的是 unst
  • SLAM学习笔记(三) 后端优化与回环检测

    后端优化是对相机位姿和点位置的再度优化 xff08 相较于前端优化规模更大 xff09 xff0c 回环检测是对地图进行的一种修正 xff08 当机器人回到原来位置时 xff0c 地图也实现一个闭环 xff09 后端优化与回环检测 后端优化
  • 基于STM32 HAL库的自定义USB HID设备通信

    最近有个项目需要用到STM32的高速通信 xff0c 准备调试一下STM32的USB功能 xff0c 但是发现F103C8T6只有全速USB xff0c 因此作为HID设备一帧只能发送64字节 xff0c 最小间隔是1ms xff0c 显然
  • PX4-Autopilot安装

    Ubuntu 18 04 43 ROS Melodic 1 PX4源码下载 1 先mkdir一个文件夹 xff0c 在该文件夹下进行源码下载 xff08 因为在github下载很慢 xff0c 所以后续到PX4 Autopilot目录下再单
  • MAVROS(1)offboard模式(手动和roslaunch启动)

    官方教程 xff1a https docs px4 io master en ros mavros offboard html 1 编写功能包 参考 xff1a https blog csdn net weixin 44917390 art
  • VINS-Fusion安装

    1 安装Ceres Solver 官方教程 xff1a http ceres solver org installation html 参考教程 xff1a https blog csdn net qq 27251141 article d
  • APM-MAVROS连接

    1 运行mavros roslaunch mavros apm launch fcu url 61 34 dev ttyUSB0 921600 34 2 读取topic之前先运行以下命令 xff0c 修改飞控广播频率 rosservice
  • PX4 Avoidance(3DVFH*)

    Github地址 xff1a https github com PX4 PX4 Avoidance readme PX4用户指南 xff1a computer vision obstacle avoidance PX4 Avoidance下
  • FreeRTOS源码分析与应用开发04:消息队列

    目录 1 队列结构 2 创建队列 2 1 动态创建队列 2 1 1 xQueueCreate函数 2 1 2 xQueueGenericCreate函数 2 1 3 xQueueGenericReset函数 2 2 静态创建队列 2 2 1
  • APM-SITL Gazebo MAVROS 仿真

    1 配置APM SITL环境 1 下载安装Ardupilot 参考链接 xff1a 官方教程 注意 xff1a 文件install prereqs ubuntu sh路径在 ardupilot Tools environment insta
  • Ego-planner-swarm安装及报错解决

    项目地址 xff1a https github com ZJU FAST Lab ego planner swarmhttps github com ZJU FAST Lab ego planner swarm https github c
  • 单片机和嵌入式系统的区别

    单片机和嵌入式系统的区别 嵌入式和单片机并不是一对相对的概念 xff0c 嵌入式系统包括硬件和软件部分 xff0c 而单片机是单片微型计算机 Single Chip Microcomputer 的简称 xff0c 即微控制单元 Microc
  • 程序员的5个级别,你属于哪一个等级?

    码农和程序员虽说是调侃 xff0c 但是实质上还真的是不一样 还别说 xff0c 程序员还是有分等级的 比如有技术专家 xff0c 初级专员等 程序员的级别不同 xff0c 薪水也是有着天壤之别 免费领取Python学习资料可以加小编的微信
  • FutureTask的使用示例

    今天看书 xff0c 有关于 FutureTask 的介绍 xff0c 感觉还蛮有意思的 xff0c 可以用它来做一些比较花时间的事情 下面打个通俗的比方来说明一下它的用处 xff1a 比如 xff0c 早上一大早的去公交站台等公交 xff