当前位置:网站首页>获取线程返回值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
边栏推荐
猜你喜欢
政务云迁移实践 北明数科使用HyperMotion云迁移产品为某政府单位实施上云迁移项目,15天内完成近百套主机迁移
HyperBDR云容灾V3.3.0版本发布|容灾功能升级,资源组管理功能优化
Nifi 快速安装及文件同步操作
帆软中单元格中隔行变色以及数量大于100字体变大变红设置
帆软分割求解:一段字符串,只取其中某个字符(所需要的字段)
基于CM管理的CDH6.3.2集群集成Atlas2.1.0
postman批量生产body信息(实现批量修改数据)
使用DialogFragment的一些感受及防踩坑经验(getActivity、getDialog为空,cancelable无效等)
帆软中使用if else 进行判断-使用标题条件进行判断
使用开源调研工具Prophet是一种什么体验?
随机推荐
帆软中根据分类进行汇总
sql中出现一个变态问题
squid代理
正则表达式
Logging module
mysql 5.1升级到5.610
jacob打印word
服务器日志分析工具(识别,提取,合并,统计异常信息)
关于云容灾,你需要知道这些
Understand the concepts of virtual base class, virtual function and pure virtual function (turn)
使用itextpdf实现截取pdf文档第几页到第几页,进行分片
Switch usage (wechat applet)
Can I compile the header file and source file of the template separately
关于训练过程中损失函数出现断崖式增长的问题
如何快速批量创建文本文档?
Some good articles on pthread multithreading
Use of WiFi module based on wechat applet
VMware Workstation 无法连接到虚拟机。系统找不到指定的文件
OpenStack如何跨版本升级
MySQL数据库讲解(十)