当前位置:网站首页>JUC线程池(一): FutureTask使用
JUC线程池(一): FutureTask使用
2022-08-05 00:23:00 【学到的心态】
Future 表示了一个任务的生命周期,是一个可取消的异步操作,它在未来的某个时刻完成,并提供对其结果的访问。
并发包中许多异步任务类都继承自Future,其中最典型的就是 FutureTask。
一. FutureTask简介
FutureTask常用来封装 Callable 和 Runnable ,也可以作为一个任务提交到线程池中执行。
Future的线程安全有CAS保证。
FutureTask实现了Future的基础功能,如获取任务执行结果(get)和取消任务(cancel)等。如果任务尚未完成获取任务执行结果时会堵塞。
二. 使用案例
通过FutureTask封装Callable实现,运行时可以获取线程的状态(是否运行完)、也可以取消任务,运行完成可以获取结果,对于线程运行可以有以下两种方式:
- 线程池运行futureTask
- Thread线程运行futureTask
public class CallDemo {
public static void main(String[] args) {
/** * * 方式1 : 线程池运行futureTask(futureTask包装的callable接口,futureTask可以拿到执行结果)。 * * FutureTask + ExecutorService: * * ExecutorService executor = Executors.newCachedThreadPool(); * Task task = new Task(); * FutureTask<Integer> futureTask = new FutureTask<Integer>(task); * executor.submit(futureTask); * executor.shutdown(); */
/** * 方式2 : 线程运行futureTask * FutureTask + Thread */
// 2. 新建FutureTask,需要一个实现了Callable接口的类的实例作为构造函数参数
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyTask());
// 3. 新建Thread对象并启动
Thread thread = new Thread(futureTask);
thread.setName("Task thread");
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread [" + Thread.currentThread().getName() + "] is running");
// 4. 调用isDone()判断任务是否结束
if (!futureTask.isDone()) {
System.out.println("Task is not done");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int result = 0;
try {
// 5. 调用get()方法获取任务结果,如果任务没有执行完成则阻塞等待
result = futureTask.get();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("result is " + result);
}
// 1. 继承Callable接口,实现call()方法,泛型参数为要返回的类型
static class MyTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Thread [" + Thread.currentThread().getName() + "] is running");
int result = 0;
for (int i = 0; i < 100; ++i) {
result += i;
}
Thread.sleep(3000);
return result;
}
}
}
三. FutureTask原理
FutureTask的类关系

FutureTask实现了RunnableFuture接口,RunnableFuture继承了Runnable和Future接口,所以FutureTask既能作为Runnable被Thread使用,也可以作为 Future 用来得到计算结果。
参考:
https://pdai.tech/md/java/thread/java-thread-x-juc-executor-FutureTask.html
边栏推荐
- E - Distance Sequence (前缀和优化dp
- STC89C52RC的P4口的应用问题
- 2022杭电多校第三场 K题 Taxi
- gorm联表查询-实战
- 刘润直播预告 | 顶级高手,如何创造财富
- 2022多校第二场 K题 Link with Bracket Sequence I
- Software testing interview questions: What is the difference between load testing, capacity testing, and strength testing?
- 软件测试面试题:什么是软件测试?软件测试的目的与原则?
- [idea] idea configures sql formatting
- 测试经理要不要做测试执行?
猜你喜欢

Cloud native - Kubernetes 】 【 scheduling constraints

Modelers experience sharing: model study method

QSunSync Qiniu cloud file synchronization tool, batch upload

测试经理要不要做测试执行?

leetcode经典例题——单词拆分

redis可视化管理软件Redis Desktop Manager2022

How to automatically push my new articles to my fans (very simple, can't learn to hit me)

QSunSync 七牛云文件同步工具,批量上传

2 用D435i运行VINS-fusion
![[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots](/img/fa/5bdc81b1ebfc22d31f42da34427f3e.png)
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
随机推荐
Will domestic websites use Hong Kong servers be blocked?
Getting started with 3D modeling for games, what modeling software can I choose?
软件测试面试题:负载测试、容量测试、强度测试的区别?
2022牛客多校第三场 J题 Journey
More than 2022 cattle school training topic Link with the second L Level Editor I
Software Testing Interview Questions: About Automated Testing Tools?
"WEB Security Penetration Testing" (28) Burp Collaborator-dnslog out-band technology
MongoDB搭建及基础操作
2022 Hangzhou Electric Power Multi-School Session 3 Question B Boss Rush
2022牛客多校训练第二场 L题 Link with Level Editor I
Mysql_13 事务
TinyMCE禁用转义
【无标题】
找不到DiscoveryClient类型的Bean
软件测试面试题:软件都有多少种分类?
软件测试面试题:BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
软件测试面试题:您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程?
About I double-checked and reviewed the About staff page, returning an industry question
2022牛客多校训练第二场 J题 Link with Arithmetic Progression
[idea] idea configures sql formatting