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 超时中断处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lambda表达式python啥意思_P
- 下一篇: java实现简易聊天窗口先运行服务器还是