当前位置:网站首页>获取线程返回值Future接口与FutureTask类使用介绍
获取线程返回值Future接口与FutureTask类使用介绍
2022-04-23 14:07:00 【pureluckyfish】
启动一个线程,计算机根据cpu及内存的使用情况,在未来的时间点执行线程内的代码。怎么知道线程是否执行完成,结果是什么呢?Future英文意思“未来、将来的”,顾名思义Future接口应运而生。
一、Future接口介绍
使用方法get进行检索,必要时阻塞,直到它准备好。cancel方法执行取消操作。提供了其他方法来确定任务是正常完成还是被取消。一旦计算完成,就不能取消计算。如果为了可取消而使用Future,但不提供可用的结果,可以声明Future>,并返回null作为底层任务的结果。
返回值 | 方法名称 | 方法用途描述 |
boolean | cancel(boolean mayInterruptIfRunning) | 尝试取消此任务的执行。如果任务已经完成、已经被取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时该任务没有启动,则该任务永远不应该运行。如果该任务已经启动,则mayInterruptIfRunning参数确定执行该任务的线程是否应该中断以试图停止该任务 |
boolean | isCancelled() | 如果此任务在正常完成之前被取消,则返回true |
boolean | isDone() | 如果此任务完成则返回true |
V | get() | 获取线程执行结果,会一直等待,直到线程执行完成 |
V | get(long timeout, TimeUnit unit) | 获取线程执行结果,如果在指定时间内没有获取到结果则会抛出异常 |
二、Future代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
public class Future_FutureTask {
//创建线程池
ExecutorService exec = Executors.newCachedThreadPool();
@Test
public void FutureTest() throws Exception {
//返回Future
Future<?> future = exec.submit(() -> {
System.out.println("Runnabel接口,沒有返回值");
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (future.isDone()) {
System.out.println("获取线程返回结果:" + future.get());
} else {
System.out.println("获取线程返回结果:" + future.get(10L, TimeUnit.SECONDS));
}
System.out.println("线程是否被取消" + future.isCancelled());
}
}
三、FutureTask实现类介绍
该类提供了Future接口的基本实现;FutureTask可以用来包装成 Callable
或者 Runnable
对象来使用。因为FutureTask实现了Runnable接口,所以FutureTask可以提交给Executor执行
四、FutureTask代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
public class Future_FutureTask {
// 创建线程池
ExecutorService exec = Executors.newCachedThreadPool();
@Test
public void FutureTaskTest() throws Exception {
// 使用Lambda 表达式创建对象
// FutureTask<V> futureTask = new FutureTask<V>(Callable<V> callable)
FutureTask<String> futureTask = new FutureTask<String>(() -> {
return "FutureTask使用介绍";
});
exec.execute(futureTask);
System.out.println("获取FutureTask的返回结果:" + futureTask.get());
}
}
五、总结
Future表示异步计算(线程)的结果。提供的方法用于检查计算是否完成、等待其完成以及检索计算的结果。
FutureTask类是Future接口的实现类
版权声明
本文为[pureluckyfish]所创,转载请带上原文链接,感谢
https://blog.csdn.net/sinat_33918956/article/details/118652810
边栏推荐
猜你喜欢
Recyclerview advanced use (I) - simple implementation of sideslip deletion
Jira截取全图
There is a mining virus in the server
HyperMotion云迁移助力中国联通,青云完成某央企上云项目,加速该集团核心业务系统上云进程
某政务云项目业务系统迁移调研实践
快速安装mongodb
Subscription number development of wechat applet (message push)
帆软调用动态传参的方法,在标题中设置参数
Windos中安装labellmg教程
微信小程序调用客服接口
随机推荐
Mysql个人学习总结
squid代理
Indoor and outdoor map switching (indoor three-point positioning based on ibeacons)
JDBC详解
金融行业云迁移实践 平安金融云整合HyperMotion云迁移解决方案,为金融行业客户提供迁移服务
DeepinV20安装Mariadb
VMWare安装64位XP中文教程
教育行业云迁移最佳实践:海云捷迅使用HyperMotion云迁移产品为北京某大学实施渐进式迁移,成功率100%
基于CM管理的CDH6.3.2集群集成Atlas2.1.0
PyMySQL
openstack理论知识
Understand the concepts of virtual base class, virtual function and pure virtual function (turn)
使用DialogFragment的一些感受及防踩坑经验(getActivity、getDialog为空,cancelable无效等)
Wechat applet communicates with low-power Bluetooth - sending data to hardware (III)
Gartner预测云迁移规模大幅增长;云迁移的优势是什么?
Jmeter安装教程以及我遇到的问题的解决办法
RobotFramework 之 公共变量
win10自带Groove音乐不能播放CUE和APE文件的一种曲线救国办法,自己创建aimppack插件包,AIMP安装DSP插件
OpenStack如何跨版本升级
OpenStack命令操作