当前位置:网站首页>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
- 软件测试面试题:您如何看待软件过程改进?在您曾经工作过的企业中,是否有一些需要改进的东西呢?您期望的理想的测试人员的工作环境是怎样的?
- node使用redis
- gorm联表查询-实战
- 2022杭电多校第一场 1004 Ball
- 2022牛客多校训练第二场 L题 Link with Level Editor I
- 《WEB安全渗透测试》(28)Burp Collaborator-dnslog外带技术
- Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
- 【无标题】
- 软件测试面试题:什么是软件测试?软件测试的目的与原则?
猜你喜欢
性能测试如何准备测试数据
【LeetCode】Summary of Two Pointer Problems
导入JankStats检测卡帧库遇到问题记录
TinyMCE disable escape
gorm joint table query - actual combat
leetcode: 266. All Palindromic Permutations
看图识字,DELL SC4020 / SCv2000 控制器更换过程
国内网站用香港服务器会被封吗?
How to automatically push my new articles to my fans (very simple, can't learn to hit me)
matlab中rcosdesign函数升余弦滚降成型滤波器
随机推荐
电子行业MES管理系统的主要功能与用途
could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
More than 2022 cattle school training topic Link with the second L Level Editor I
leetcode: 269. The Martian Dictionary
Three tips for you to successfully get started with 3D modeling
TinyMCE disable escape
2 用D435i运行VINS-fusion
tensor.nozero(),面具,面具
翁恺C语言程序设计网课笔记合集
2022 Hangzhou Electric Power Multi-School Session 3 Question L Two Permutations
typeScript - Partially apply a function
D - I Hate Non-integer Number (选数的计数dp
Zombie and orphan processes
redis可视化管理软件Redis Desktop Manager2022
典型相关分析CCA计算过程
软件测试面试题:BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
软件测试面试题:做好测试计划的关键是什么?
2022 The Third J Question Journey
阅读笔记:如何理解DevOps?
uinty lua 关于异步函数的终极思想