笔者在平常的项目开发中,会遇到有些程序执行时间过长的问题(比如查询数据库的时间过长,或者调用某一接口执行的时间过长),导致程序长时间卡死,因此,需要对程序进行超时中断处理,给程序的执行时间设定一个时间范围限制,如果超过这一范围,则进行中断处理,包括中断线程并且返回超时的结果。有时候线程已经在执行了,是无法中断的,程序要返回超时的结果,只是线程会继续执行,直到线程执行完成。

下面将介绍两种超时中断处理的实现方法,方法一是本人自己利用线程实现的,方法二则利用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 超时中断处理相关推荐

  1. java 硬件中断_Java异步事件:轮询与中断

    CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中.然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个. 一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,用来存储程序和 ...

  2. java io中断_Java的Interrupt与线程中断

    中断状态 每一个线程都有一个boolean属性,表示中断状态,初始值为false. 中断线程:Thread.interrupt() 正常情况下,只是将线程的中断状态变为true.线程中可以通过轮询中断 ...

  3. Java并发编程—如何实现线程的超时中断

    原文作者:大老二在不在 原文地址:Java中如何实现线程的超时中断 目录 背景 思路 实现 背景 之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了 ...

  4. Java中如何实现线程的超时中断

    转载自  Java中如何实现线程的超时中断 背景 之前在实现熔断降级组件的时候,需要实现接口请求的超时中断.意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果请求进入熔断器开始计时,接 ...

  5. io和nio的缓冲_IO与NIO –中断,超时和缓冲区

    io和nio的缓冲 假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应能力至关重要的情况下. 换句话说,如果由于某种原因文件系统过载,而我们无法在不到一秒钟的时间内写入文件,它应该放弃. ...

  6. IO与NIO –中断,超时和缓冲区

    假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应速度至关重要的情况下. 换句话说,如果由于某种原因文件系统过载,并且我们无法在不到一秒钟的时间内写入文件,则应该放弃. ExecutorS ...

  7. java 接口定义超时时间,超时抛出异常,并且任务继续触发

    第一种普通线程: package com.zz.meridian;import java.util.concurrent.*;/*** java 多线程调用接口超时处理*/ public class ...

  8. 脚本运行显示服务器超时,java执行shell脚本超时

    java执行shell脚本超时 [2021-02-11 04:20:34]  简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...

  9. LPC1768 UART超时中断的使用

    与FIFO和接收触发设置配合可以作为类似空闲中断的功能 FCR控制寄存器设置FIFO使能和触发字节数. 中断标识寄存器IIR.2a即接收成功中断RDA,2b即字符超时中断CTI. 当接收FIFO(16 ...

最新文章

  1. CHUCK手把手带你搞定OPENSTACK
  2. 树莓派镜像源切换之旅.md
  3. Facebook开源Torchnet,加速AI研究
  4. 02-线性结构4 Pop Sequence
  5. linux centos7 安装最新版git 教程
  6. shell编程之文本处理工具sed
  7. C++易被忽略的知识点:移动语义 左值右值
  8. Orchard Core Framework:ASP.NET Core 模块化,多租户框架
  9. duilib中界面的布局方式
  10. LeetCode--41.缺失的第一个正数(C)
  11. 关于asp.net 中 cookies 的清空
  12. Free Syslog Forwarder–免费的Syslog转发工具
  13. java定时器频率自定义_@Scheduled 定时器 cron表达式自定义配置
  14. Android中多点触控以及手势的基础知识
  15. bootstrap框架之面包屑导航(Breadcrumbs)
  16. 围城书评_书评:关于HTML5的真相
  17. PPT中如何插入指定大小的矩阵
  18. Linux-MYSQL 登录数据库(命令行,图形化) 及 远程登录
  19. Vue源码学习之Computed与Watcher原理
  20. RabbitMQ安装流程

热门文章

  1. TypeScript的类型断言,有点像ABAP的强制类型转换
  2. Eclipse里调试时遇到Source not found应该怎么办
  3. SAP ERP里如何创建一个新的material类型
  4. Hybris commerce里用web service为什么查询不到产品的描述信息
  5. 雪妖现世:给SAP Fiori Launchpad增添雪花纷飞的效果
  6. how does tomcat access js - SAPUI5 Core Libraries
  7. POC of settype read harmonization - using description settype as example
  8. 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
  9. SAP OData Multiple Origin composition test - Opportunity Creation case
  10. CRM WebClient UI里标准configuration和custom configuration区别