Java程序执行超时——Future接口介绍

摘要:
在Java中,如果需要设置代码执行的最长时间,即超时,则可以将Java线程池ExecutorService类与Future接口一起使用。Future接口是Java线程Future模式的实现,可用于异步计算。一段时间后,我可以从Future得到结果。Future接口提供了一种方法来检测任务是否已执行,等待任务执行并获得结果,或者设置任务执行的超时。我们通常使用FutureTask来处理我们的任务。FutureTask类还实现了Runnable接口,因此它可以直接提交给Executor执行。

Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实 现,可以来进行异步计算。

Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。

Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。

Future接口是一个泛型接口,严格的格式应该是Future<V>,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

  • booleancancel(boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
  • booleanisCancelled() 任务是否已经取消,任务正常完成前将其取消,则返回true
  • booleanisDone() 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
  • Vget() throws InterruptedException, ExecutionException 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
  • Vget(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException

Future的实现类有java.util.concurrent.FutureTask<V>即 javax.swing.SwingWorker<T,V>。通常使用FutureTask来处理我们的任务。FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:

Java代码收藏代码
  1. ExecutorServiceexecutor=Executors.newSingleThreadExecutor();
  2. FutureTask<String>future=
  3. newFutureTask<String>(newCallable<String>(){//使用Callable接口作为构造参数
  4. publicStringcall(){
  5. //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
  6. }});
  7. executor.execute(future);
  8. //在这里可以做别的任何事情
  9. try{
  10. result=future.get(5000,TimeUnit.MILLISECONDS);//取得结果,同时设置超时执行时间为5秒。同样可以用future.get(),不设置执行超时时间取得结果
  11. }catch(InterruptedExceptione){
  12. futureTask.cancel(true);
  13. }catch(ExecutionExceptione){
  14. futureTask.cancel(true);
  15. }catch(TimeoutExceptione){
  16. futureTask.cancel(true);
  17. }finally{
  18. executor.shutdown();
  19. }

不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口作为参数,具有很大的灵活性。使用示例如下:

Java代码收藏代码
  1. ExecutorServiceexecutor=Executors.newSingleThreadExecutor();
  2. FutureTask<String>future= executor.submit(
  3. newCallable<String>(){//使用Callable接口作为构造参数
  4. publicStringcall(){
  5. //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
  6. }});
  7. //在这里可以做别的任何事情
  8. //同上面取得结果的代码

实现Future接口:

  1. privateclassFutureTest<V>implementsFuture<V>{
  2. @Override
  3. publicbooleancancel(booleanarg0){
  4. //TODOAuto-generatedmethodstub
  5. returnfalse;
  6. }
  7. @Override
  8. publicVget()throwsInterruptedException,ExecutionException{
  9. //TODOAuto-generatedmethodstub
  10. returnnull;
  11. }
  12. @Override
  13. publicVget(longarg0,TimeUnitarg1)throwsInterruptedException,
  14. ExecutionException,TimeoutException{
  15. //TODOAuto-generatedmethodstub
  16. returnnull;
  17. }
  18. @Override
  19. publicbooleanisCancelled(){
  20. //TODOAuto-generatedmethodstub
  21. returnfalse;
  22. }
  23. @Override
  24. publicbooleanisDone(){
  25. //TODOAuto-generatedmethodstub
  26. returnfalse;
  27. }
  28. }

实现Callbale接口:
  1. privateclassCallableTest<V>implementsCallable<V>{
  2. @Override
  3. publicVcall()throwsException{
  4. //TODOAuto-generatedmethodstub
  5. returnnull;
  6. }
  7. }

免责声明:文章转载自《Java程序执行超时——Future接口介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网站日志流量分析系统之(日志埋点)如何优化mysql查询速度下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序http接口封装怎么实现

微信小程序http接口封装怎么实现?微信小程序开发的编写,需要调用后端接口,经常要用到wx.request方法,所以就自己封装了一下,简化一下代码,如果能给大家提供帮助更好,我的项目后端是使用的Java SSM框架,wx.request的URL就是后端提供的接口。在封装的时候我在网上看了很多篇博客,90%以上的全都是直接在success回调函数中直接打印返...

《Java2 实用教程(第五版)》学习指导

《Java2 实用教程(第五版)》 第1章Java入门 主要内容:P1 1.1Java的地位:P1 1.2Java的特点:P2 1.3安装JDK:P5 1.4Java程序的开发步骤:P8 1.5简单的Java应用程序:P9 1.6Java反编译:P13 第2章基本数据类型与数组 主要内容:P17 2.1标识符与关键字:...

说出一些常用的类,包,接口,请各举5个 ?

常用的包有: java.lang包下包括Math、System、StringBuilder、StringBuffer、Runtime、Thread、Runnable等。 java.util包下包括List、Set、Map,以及这些接口的常用实现类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。...

Go-kit介绍及构建微服务

Go-kit简介   Go-kit 并不是一个微服务框架,而是一套微服务工具集,我们可以用工具Go-kit为 Go 创建微服务,包含包和接口,有点类似于JAVA Spring Boot,但是没那么强大。可以利用Go-kit提供的API和规范可以创建健壮的,可维护性高的微服务体系,它提供了用于实现系统监控和弹性模式组件的库,例如日志记录、跟踪、限流和熔断等,...

WCF学习笔记1(体系架构和行为扩展)

引用《WCF服务编程》里的一段话:“以WCF为基础框架搭建面向服务的企业级应用程序,以WF工作流引擎支撑企业应用中业务流程的传递与控制,以Cardspace和WCF固有的安全测罗保证企业信息的安全,最后以ASP.NET AJAX,WPF和SILVERLIGHT技术丰富客户端界面的绚丽表现,从而改善企业客户对应用程序的体验,这就是微软实现企业级应用的霸业宏图...

使用coreapi自动生成api接口文档

使用coreapi自动生成api接口文档 安装第三方扩展模块 pip install coreapi 在路由中配置: from rest_framework.documentation import include_docs_urls urlpatterns = [ # 自动生成接口文档 path('docs/',include_doc...