java 超时中断_JAVA 超时中断处理
笔者在平常的项目开发中,会遇到有些程序执行时间过长的问题(比如查询数据库的时间过长,或者调用某一接口执行的时间过长),导致程序长时间卡死,因此,需要对程序进行超时中断处理,给程序的执行时间设定一个时间范围限制,如果超过这一范围,则进行中断处理,包括中断线程并且返回超时的结果。有时候线程已经在执行了,是无法中断的,程序要返回超时的结果,只是线程会继续执行,直到线程执行完成。
下面将介绍两种超时中断处理的实现方法,方法一是本人自己利用线程实现的,方法二则利用JDK自带的工具类FutureTask。
1、方法一
import java.util.Date;
public class TaskThread extends Thread {
private Task task;
public TaskThread(Task task) {
this.task = task;
}
public void run() {
int i = 0;
while(true && i < 10){
if(Task.STATUS_INTERRUPT.equals(task.getStatus())){
System.out.println("线程执行中断");
break;
}
System.out.println(new Date().toLocaleString()+":每隔1秒打印一下日志");
try {
Thread.sleep(1*1000);
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
task.setStatus(Task.STATUS_FINISHED);
System.out.println("线程执行完成");
}
}
import java.util.Date;
public class Task {
public static final String STATUS_START = "START";
public static final String STATUS_FINISHED = "FINISHED";
public static final String STATUS_INTERRUPT = "INTERRUPT";
private String status = "";
private Date startTime = null;
private TaskThread taskThread = null;
public void setStatus(String status) {
this.status = status;
}
public String execute() {
this.setStatus(Task.STATUS_START);
startTime = new Date();
taskThread = new TaskThread(this);
try{
taskThread.start();
}catch (Exception e) {
e.printStackTrace();
}
String result = "";
while(true){
if(Task.STATUS_FINISHED.equals(this.getStatus())){
result = "任务执行成功";
break;
}
Date currentTime = new Date();
if((currentTime.getTime() - this.getStartTime().getTime()) > 5*1000){
this.setStatus(Task.STATUS_INTERRUPT);
result = "任务执行中断";
System.out.println("线程执行超时:限定时间是5秒!");
break;
}
}
return result;
}
public String getStatus() {
return status;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
}
/**
* 当任务执行超时或者执行过程出现错误时,实现任务中断功能。
* @author brushli
* @date 2013-10-05
*
*/
public class InterruptExample {
public static void main(String[] args) {
Task task = new Task();
String execute = task.execute();
System.out.println("result="+execute);
}
}
程序执行的结果:
2013-10-5 15:10:45:每隔1秒打印一下日志
2013-10-5 15:10:46:每隔1秒打印一下日志
2013-10-5 15:10:47:每隔1秒打印一下日志
2013-10-5 15:10:48:每隔1秒打印一下日志
2013-10-5 15:10:49:每隔1秒打印一下日志
线程执行超时:限定时间是5秒!
result=任务执行中断
线程执行中断
线程执行完成
更改一下类Task中的代码,将超时的时间范围设定为50秒
if((currentTime.getTime() - this.getStartTime().getTime()) > 50*1000){
this.setStatus(Task.STATUS_INTERRUPT);
result = "任务执行中断";
System.out.println("线程执行超时:限定时间是50秒!");
break;
}
此时程序的执行结果是:
2013-10-5 15:12:11:每隔1秒打印一下日志
2013-10-5 15:12:12:每隔1秒打印一下日志
2013-10-5 15:12:13:每隔1秒打印一下日志
2013-10-5 15:12:14:每隔1秒打印一下日志
2013-10-5 15:12:15:每隔1秒打印一下日志
2013-10-5 15:12:16:每隔1秒打印一下日志
2013-10-5 15:12:17:每隔1秒打印一下日志
2013-10-5 15:12:18:每隔1秒打印一下日志
2013-10-5 15:12:19:每隔1秒打印一下日志
2013-10-5 15:12:20:每隔1秒打印一下日志
线程执行完成
result=任务执行成功
2、方法二
利用JDK自带的工具类:FutureTask
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* 当任务执行超时或者执行过程出现错误时,实现任务中断功能。
* @author brushli
* @date 2013-10-05
*
*/
public class InterruptTest {
public static void main(String[] args) {
System.out.println("result="+new InterruptTest().getResult());
}
public String getResult() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask future = new FutureTask(new Callable() {
public String call() throws Exception {
InterruptTest interrupt = new InterruptTest();
return interrupt.getValue();
}
});
executorService.execute(future);
String result = null;
try{
//设定超时的时间范围为10秒
result = future.get(10, TimeUnit.SECONDS);
}catch (InterruptedException e) {
future.cancel(true);
System.out.println("方法执行中断");
}catch (ExecutionException e) {
future.cancel(true);
System.out.println("Excution异常");
}catch (TimeoutException e) {
future.cancel(true);
result = "方法执行时间超时";
}
executorService.shutdownNow();
return result;
}
public String getValue()
{
try{
Thread.sleep(5000);
System.out.println("正常执行");
}catch (Exception e) {
e.printStackTrace();
}
return "正常结果";
}
}
程序运行的结果是:
正常执行
result=正常结果
修改一下超时的时间:
//设定超时的时间范围为3秒
result = future.get(3, TimeUnit.SECONDS);
程序运行的结果是:
java.lang.InterruptedException: sleep interruptedresult=方法执行时间超时
at java.lang.Thread.sleep(Native Method)
at com.interrupt.InterruptTest.getValue(InterruptTest.java:48)
at com.interrupt.InterruptTest$1.call(InterruptTest.java:23)
at com.interrupt.InterruptTest$1.call(InterruptTest.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
java 超时中断_JAVA 超时中断处理相关推荐
- java 硬件中断_Java异步事件:轮询与中断
CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中.然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个. 一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,用来存储程序和 ...
- java io中断_Java的Interrupt与线程中断
中断状态 每一个线程都有一个boolean属性,表示中断状态,初始值为false. 中断线程:Thread.interrupt() 正常情况下,只是将线程的中断状态变为true.线程中可以通过轮询中断 ...
- Java并发编程—如何实现线程的超时中断
原文作者:大老二在不在 原文地址:Java中如何实现线程的超时中断 目录 背景 思路 实现 背景 之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了 ...
- Java中如何实现线程的超时中断
转载自 Java中如何实现线程的超时中断 背景 之前在实现熔断降级组件的时候,需要实现接口请求的超时中断.意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果请求进入熔断器开始计时,接 ...
- io和nio的缓冲_IO与NIO –中断,超时和缓冲区
io和nio的缓冲 假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应能力至关重要的情况下. 换句话说,如果由于某种原因文件系统过载,而我们无法在不到一秒钟的时间内写入文件,它应该放弃. ...
- IO与NIO –中断,超时和缓冲区
假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应速度至关重要的情况下. 换句话说,如果由于某种原因文件系统过载,并且我们无法在不到一秒钟的时间内写入文件,则应该放弃. ExecutorS ...
- java 接口定义超时时间,超时抛出异常,并且任务继续触发
第一种普通线程: package com.zz.meridian;import java.util.concurrent.*;/*** java 多线程调用接口超时处理*/ public class ...
- 脚本运行显示服务器超时,java执行shell脚本超时
java执行shell脚本超时 [2021-02-11 04:20:34] 简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...
- LPC1768 UART超时中断的使用
与FIFO和接收触发设置配合可以作为类似空闲中断的功能 FCR控制寄存器设置FIFO使能和触发字节数. 中断标识寄存器IIR.2a即接收成功中断RDA,2b即字符超时中断CTI. 当接收FIFO(16 ...
最新文章
- CHUCK手把手带你搞定OPENSTACK
- 树莓派镜像源切换之旅.md
- Facebook开源Torchnet,加速AI研究
- 02-线性结构4 Pop Sequence
- linux centos7 安装最新版git 教程
- shell编程之文本处理工具sed
- C++易被忽略的知识点:移动语义 左值右值
- Orchard Core Framework:ASP.NET Core 模块化,多租户框架
- duilib中界面的布局方式
- LeetCode--41.缺失的第一个正数(C)
- 关于asp.net 中 cookies 的清空
- Free Syslog Forwarder–免费的Syslog转发工具
- java定时器频率自定义_@Scheduled 定时器 cron表达式自定义配置
- Android中多点触控以及手势的基础知识
- bootstrap框架之面包屑导航(Breadcrumbs)
- 围城书评_书评:关于HTML5的真相
- PPT中如何插入指定大小的矩阵
- Linux-MYSQL 登录数据库(命令行,图形化) 及 远程登录
- Vue源码学习之Computed与Watcher原理
- RabbitMQ安装流程
热门文章
- TypeScript的类型断言,有点像ABAP的强制类型转换
- Eclipse里调试时遇到Source not found应该怎么办
- SAP ERP里如何创建一个新的material类型
- Hybris commerce里用web service为什么查询不到产品的描述信息
- 雪妖现世:给SAP Fiori Launchpad增添雪花纷飞的效果
- how does tomcat access js - SAPUI5 Core Libraries
- POC of settype read harmonization - using description settype as example
- 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
- SAP OData Multiple Origin composition test - Opportunity Creation case
- CRM WebClient UI里标准configuration和custom configuration区别