Java实现任务超时处理方法
作者:不才黄某 发布时间:2023-01-09 14:46:45
标签:java,任务,超时
任务超时处理是比较常见的需求,比如在进行一些比较耗时的操作(如网络请求)或者在占用一些比较宝贵的资源(如数据库连接)时,我们通常需要给这些操作设置一个超时时间,当执行时长超过设置的阈值的时候,就终止操作并回收资源。Java中对超时任务的处理有两种方式:一种是基于异步任务结果的超时获取,一种则是使用延时任务来终止超时操作。下文将详细说明。
一、基于异步任务结果的超时获取
基于异步任务结果的获取通常是跟线程池一起使用的,我们向线程池提交任务时会返回一个Future对象,在调用Future的get方法时,可以设置一个超时时间,如果超过设置的时间任务还没结束,就抛出异常。接下来看代码:
public class FutureDemo {
static ExecutorService executorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
public static void main(String[] args) {
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String 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 class RunningTask {
private volatile boolean isStop;
public void stop(){
this.isStop=true;
}
public void doing() {
int i=1;
while (!isStop){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
}
System.out.println("任务被中断。");
}
}
这个工作线程每隔一秒钟会去检查下isStop变量,因此我们可以通过isStop变量来取消任务。至于取消任务的逻辑我们放在了定时器里面,代码如下:
public class CancelTask implements Runnable {
private RunningTask runningTask;
public CancelTask(RunningTask runningTask) {
this.runningTask = runningTask;
}
@Override
public void run() {
runningTask.stop();
}
}
可以看到,该定时器的作用就是在一定的时间之后去中断工作线程的运行。接下来测试一下:
public class ScheduleDemo {
static ScheduledExecutorService executorService= Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()*2);
public static void main(String[] args) {
RunningTask runningTask=new RunningTask();
ScheduledFuture<?> scheduledFuture = executorService.schedule(new CancelTask(runningTask), 3, TimeUnit.SECONDS);
runningTask.doing();
if(!scheduledFuture.isDone()){
scheduledFuture.cancel(true);
}
}
}
运行结果如下:
可以看到,任务在超时之后也可以被取消。
总结
以上所述是小编给大家介绍的Java实现任务超时处理方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/hzjjames/p/java_timeout.html?utm_source=debugrun&utm_medium=referral


猜你喜欢
- 一、添加插件apply plugin: 'maven-publish'二、添加如下配置//打包源码task sourceJa
- 用java swing写的一个简单的五子棋游戏。下面是Main.java。package com.crossing.main;import
- 前言在做项目的时候,遇到一个需求,需要我对Chart图标标记数据正在运行,实现数据可视化,因为我们的表格是隐藏Y轴的刻度是看不到数据值的,于
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- 当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到
- 在IDEA中配置log4j,步骤很简单1.在Maven中加入以下配置<dependency> <groupI
- 1.创建简单的XML文件为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下:using S
- SpringBoot实践,开发社区登录模块今日份开启 发送邮件三个步骤:1、邮箱设置首先需要注册一个新浪邮箱 18215626061@sin
- 我就废话不多说了,大家还是直接看代码吧~import java.util.concurrent.ExecutorService; impor
- 一.模拟问题最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号
- 参考dubbo和shenyu网关实现自定义的SPISPI标注注解标注提供SPI能力接口的注解@Documented@Retention(Re
- ElGamal数字签名,供大家参考,具体内容如下一、实验目的学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签
- 本文实例讲述了Android编程实现自定义进度条颜色的方法。分享给大家供大家参考,具体如下:android 自定义进度条颜色先看图基于产品经
- 1. 前言我们知道,在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 和 SynchronizedMap
- 我们经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环的效果。看到那样的效果,相信大家都会想到ViewPag
- 一、项目简述功能包括: 用户登录,设备管理,设备指派,贝附信息,信息公告, 信息维护,系统管理,图表统计等等功能。二、项目运行环境配置: J
- 1. 新建项目引入web和security包完整的pom.xml文件如下<?xml version="1.0" e
- 一、如何显示assets/license.txt(中文)的内容? (1)方法1:InputStream.available()得到字节数,然
- 本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类。分享给大家供大家参考,具体如下:说明:此工具类是本人开发中总结下
- 本文实例讲述了Android自定义控件样式的方法。分享给大家供大家参考,具体如下:Android控件样式自定义是用定义在drawable文件