任务超时处理是比较常见的需求,比如在进行一些比较耗时的操作(如网络请求)或者在占用一些比较宝贵的资源(如数据库连接)时,我们通常需要给这些操作设置一个超时时间,当执行时长超过设置的阈值的时候,就终止操作并回收资源。Java中对超时任务的处理有两种方式:一种是基于异步任务结果的超时获取,一种则是使用延时任务来终止超时操作。下文将详细说明。

一、基于异步任务结果的超时获取

基于异步任务结果的获取通常是跟线程池一起使用的,我们向线程池提交任务时会返回一个Future对象,在调用Future的get方法时,可以设置一个超时时间,如果超过设置的时间任务还没结束,就抛出异常。接下来看代码:

public classFutureDemo {static ExecutorService executorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);public static voidmain(String[] args) {

Future future = executorService.submit(new Callable() {

@OverridepublicString call() {try{

TimeUnit.SECONDS.sleep(10);

}catch(InterruptedException e) {

System.out.println("任务被中断。");

}return "OK";

}

});try{

String result= future.get(2, TimeUnit.SECONDS);

}catch (InterruptedException |ExecutionException |TimeoutException e) {

future.cancel(true);

System.out.println("任务超时。");

}finally{

System.out.println("清理资源。");

}

}

}

运行代码,输出如下:

二、使用延时任务来终止超时操作

还有一种实现任务超时处理的思路是在提交任务之前先设置一个定时器,这个定时器会在设置的时间间隔之后去取消任务。当然如果任务在规定的时间内完成了,要记得取消定时器。首先来看一下我们的工作线程:

public classRunningTask {private volatile booleanisStop;public voidstop(){this.isStop=true;

}public voiddoing() {int i=1;while (!isStop){try{

TimeUnit.SECONDS.sleep(1);

}catch(InterruptedException e) {

}

}

System.out.println("任务被中断。");

}

}

这个工作线程每隔一秒钟会去检查下isStop变量,因此我们可以通过isStop变量来取消任务。至于取消任务的逻辑我们放在了定时器里面,代码如下:

public class CancelTask implementsRunnable {privateRunningTask runningTask;publicCancelTask(RunningTask runningTask) {this.runningTask =runningTask;

}

@Overridepublic voidrun() {

runningTask.stop();

}

}

可以看到,该定时器的作用就是在一定的时间之后去中断工作线程的运行。接下来测试一下:

public classScheduleDemo {static ScheduledExecutorService executorService= Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()*2);public static voidmain(String[] args) {

RunningTask runningTask=newRunningTask();

ScheduledFuture> scheduledFuture = executorService.schedule(new CancelTask(runningTask), 3, TimeUnit.SECONDS);

runningTask.doing();if(!scheduledFuture.isDone()){

scheduledFuture.cancel(true);

}

}

}

运行结果如下:

可以看到,任务在超时之后也可以被取消。

java 超时异常_Java如何实现任务超时处理相关推荐

  1. java 编写异常_Java基础编程之异常处理

    Java异常类是对于程序中可能出现的错误或者异常的一种处理方式.在设计程序的过程中,对于可能出现的异常错误,比如说用户输入错误,设备错误,磁盘满了或者代码错误等等,通常采用异常处理的方式来进行处理可能 ...

  2. java runtime 异常_Java中RuntimeException和Exception

    在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常. 所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 不 ...

  3. java 多层异常_Java多层嵌套异常处理的基本流程

    异常是程序中的一些错误,但并不是所有的错误都是异常,错误有时候是可以避免的.异常的对象有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的 ...

  4. linux java url 异常_java异常处理总结

    找到一个关于异常总结的很详细的文章,分享下.异常在我们编程中很重,在适当的位置,合理的处理或者抛出异常,对程序来说至关重要. 转:异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开 ...

  5. java runnable 异常_Java实现多线程异常捕获Runnable的案例

    这篇文章主要介绍了详解Java中多线程异常捕获Runnable的实现的相关资料,希望通过本文能帮助到大家,让大家理解掌握这样的知识,需要的朋友可以参考下 详解Java中多线程异常捕获Runnable的 ...

  6. java 到异常_java编程中遇到的异常以及异常的一些处理

    n 异常的概念 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户? 比如除法运算.读写文件操作,都可能 ...

  7. JAVA语言异常_Java语言中常用异常类EoFException是用来处理( )异常的类_学小易找答案...

    [填空题]Java语言中常用异常类ClassNotFoundException是用来处理 ( )的异常的类 [填空题]Java语言声明 ( ) 类为会产生"严重错误"的类 [简答题 ...

  8. java socket超时时间_java中socket 默认超时时间 | 学步园

    MS:永远吧 Java代码 connect publicvoidconnect(SocketAddress endpoint, inttimeout) throwsIOException Connec ...

  9. mysql 超时异常_java.sql.SQLException:超出锁定等待超时;尝试在MYSQL中重启事务异常...

    我在MYSQL中使用一个表名"test",它在事务T1期间锁定,在20分钟内完成.当我在这20分钟内通过另一个事务T2更新这个表时.我收到一个例外: - 11:58:38,584 ...

最新文章

  1. 一张图搞定OAuth2.0
  2. Android-实现一个简单的自动翻译插件
  3. C语言 *、 的含义
  4. 国内创业活动平台,创业赛事报名网站
  5. (27)VHDL实现非(数据流描述)
  6. 服务器驱动器输入信号,伺服驱动器超大齿轮比驱动控制方法
  7. java 数据库操作教程_java操作数据库的基本方法
  8. @程序员,我最多再等你两天!
  9. java8 comparator接口_Java8 Comparator 排序方法
  10. Web API-document
  11. CSDN MarkDown编辑器的使用(原内容)
  12. jaxws-ri下载链接
  13. php连接mysql超时问题
  14. Java 对 Excel 修改
  15. 用java把word转pdf
  16. 计算机显示应用程序错误窗口,电脑出现应用程序错误窗口怎么办
  17. 80072745 80072efd 解决办法
  18. Edison Chou
  19. 百度信誉保障服务架构全解析
  20. nginx 过滤ip

热门文章

  1. python反转列表不用切片_关于python:使用切片表示法反转列表
  2. Boring Partition(CF-239D)
  3. 训练日志 2019.4.6
  4. Cow Picnic(POJ-3256)
  5. 放苹果(信息学奥赛一本通-T1222)
  6. 信息学奥赛C++语言:有规律的数列
  7. 33 FI配置-财务会计-应收账款和应付账款-定义预付款的备选统驭科目
  8. 乱七八糟的编程技巧(随机数、效率)和网站(http://bytew.net/OIer/)
  9. python os库使用
  10. 有了SDS,硬件还重要吗?