FutureTask详解

简介: 本章讲解了FutureTask的用法和使用场景

FutureTask的用法

FutureTask可用于异步获取执行结果或取消执行任务的场景。经过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,以后能够在外部经过FutureTask的get方法异步获取执行结果,所以,FutureTask很是适合用于耗时的计算,主线程能够在完成本身的任务后,再去获取结果。另外,FutureTask还能够确保即便调用了屡次run方法,它都只会执行一次Runnable或者Callable任务,或者经过cancel取消FutureTask的执行等。

执行多任务计算

FutureTask执行多任务计算的使用场景安全

利用FutureTask和ExecutorService,能够用多线程的方式提交计算任务,主线程继续执行其余任务,当主线程须要子线程的计算结果时,在异步获取子线程的执行结果。

代码实现

packageorg.example;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.*;
publicclassFutureTaskForMultiCompute {
publicstaticvoidmain(String[] args) {
FutureTaskForMultiComputeinst=newFutureTaskForMultiCompute();
// 建立任务集合List<FutureTask<Integer>>taskList=newArrayList<FutureTask<Integer>>();
// 建立线程池ExecutorServiceexec=Executors.newFixedThreadPool(5);
for (inti=0; i<10; i++) {
// 传入Callable对象建立FutureTask对象FutureTask<Integer>ft=newFutureTask<Integer>(inst.newComputeTask(i, ""+i));
taskList.add(ft);
// 提交给线程池执行任务,也能够经过exec.invokeAll(taskList)一次性提交全部任务;exec.submit(ft);
        }
System.out.println("全部计算任务提交完毕, 主线程接着干其余事情!");
// 开始统计各计算线程计算结果IntegertotalResult=0;
for (FutureTask<Integer>ft : taskList) {
try {
//FutureTask的get方法会自动阻塞,直到获取计算结果为止totalResult=totalResult+ft.get();
            } catch (InterruptedExceptione) {
e.printStackTrace();
            } catch (ExecutionExceptione) {
e.printStackTrace();
            }
        }
// 关闭线程池exec.shutdown();
System.out.println("多任务计算后的总结果是:"+totalResult);
    }
privateclassComputeTaskimplementsCallable<Integer> {
privateIntegerresult=0;
privateStringtaskName="";
publicComputeTask(IntegeriniResult, StringtaskName) {
result=iniResult;
this.taskName=taskName;
System.out.println("生成子线程计算任务: "+taskName);
        }
publicStringgetTaskName() {
returnthis.taskName;
        }
@OverridepublicIntegercall() throwsException {
for (inti=0; i<100; i++) {
result=i;
            }
// 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。Thread.sleep(5000);
System.out.println("子线程计算任务: "+taskName+" 执行完成!");
returnresult;
        }
    }
}

打印结果

生成子线程计算任务: 0生成子线程计算任务: 1生成子线程计算任务: 2生成子线程计算任务: 3生成子线程计算任务: 4生成子线程计算任务: 5生成子线程计算任务: 6生成子线程计算任务: 7生成子线程计算任务: 8生成子线程计算任务: 9全部计算任务提交完毕, 主线程接着干其余事情!子线程计算任务: 3执行完成!子线程计算任务: 2执行完成!子线程计算任务: 0执行完成!子线程计算任务: 4执行完成!子线程计算任务: 1执行完成!子线程计算任务: 7执行完成!子线程计算任务: 8执行完成!子线程计算任务: 6执行完成!子线程计算任务: 9执行完成!子线程计算任务: 5执行完成!多任务计算后的总结果是:990Processfinishedwithexitcode0
相关文章
|
前端开发 Java Maven
Springboot创建项目(idea版本)
Springboot创建项目(idea版本)
494 0
|
自然语言处理 搜索推荐 开发者
SmartArXiv——基于OpenSearch LLM智能问答版构建的智能学术论文助手正式发布
本文介绍智能学术论文助手SmartArxiv的架构、应用场景和产品功能。
2372 1
element ui table 表格高度自适应
设置element ui table 表格高度自适应
2500 0
|
12月前
|
监控 安全 测试技术
进行API安全审计时,应该关注哪些关键点?
在进行API安全审计时,应关注API资产管理、身份验证与授权、数据加密、输入验证、错误处理、日志记录与监控、敏感数据保护、API网关使用、安全测试、合规性检查、异常检测、响应计划、API文档与版本控制及自动化安全措施等关键点,以提升API安全性,保护企业和用户数据安全。
459 1
|
12月前
|
机器学习/深度学习 存储 监控
AllData数据中台核心菜单五:实时开发IDE
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
消息中间件 Kafka Apache
RocketMQ - 生产者原理
RocketMQ - 生产者原理
193 0
|
监控 Java UED
Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
334 3
|
消息中间件 存储 物联网
MQTT常见问题之mqtt第4—6次调用会报错如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
缓存 JavaScript API
「Vue3系列」Vue3 计算属性(computed)、监听属性(watch)
在 Vue 3 中,计算属性(Computed Properties)是一种强大的功能,它允许你声明一个依赖于其他响应式数据属性的属性,并且这个属性的值会根据其依赖的数据的变化而自动更新。计算属性是基于它们的依赖关系进行缓存的,只有在它的相关依赖发生改变时才会重新求值。
1759 0