java阻塞超时_JAVA防线程阻塞(超时控制)
2.[代碼]TimeoutThread
/**
* java線程超時控制的實現
*
* 超時控制一般使用阻塞時間比較長的操作上,有可能是和遠程數據庫的連接,也有可能是網絡下載,在程序超時后, 往往需要進行一些操作,比如退出線程,或者重新執行.
* 本線程設置了一個超時時間 該線程開始運行后,經過指定超時時間, 該線程會拋出一個未檢查異常通知調用該線程的程序超時
* 在超時結束前可以調用該類的cancel方法取消計時
*
* @author cuilk
*/
public class TimeoutThread extends Thread {
/**
* 計時器超時時間
*/
private long timeout;
/**
* 計時是否被取消
*/
private boolean isCanceled = false;
/**
* 當計時器超時時拋出的異常
*/
private TimeoutException timeoutException;
/**
* 構造器
*
* @param timeout
* 指定超時的時間
*/
public TimeoutThread(long timeout, TimeoutException timeoutErr,Thread currentThread) {
super();
this.timeout = timeout;
this.timeoutException = timeoutErr;
// 設置本線程為守護線程
this.setDaemon(true);
this.setUncaughtExceptionHandler(new UncaughtExceptionHandlerImpl(currentThread));
}
/**
* 取消計時
*/
public synchronized void cancel() {
isCanceled = true;
}
/**
* 啟動超時計時器
*/
public void run() {
try {
Thread.sleep(timeout);
if (!isCanceled){
throw timeoutException;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public boolean hasException() {
return isCanceled;
}
/**
*
* 對線程中拋出異常的處理
*
* @author cuilk
*/
private class UncaughtExceptionHandlerImpl implements Thread.UncaughtExceptionHandler{
private Thread currentThread;
public UncaughtExceptionHandlerImpl(Thread currentThread){
this.currentThread=currentThread;
}
public void uncaughtException(Thread t, Throwable e) {
currentThread.interrupt();
}
}
}
總結
以上是生活随笔為你收集整理的java阻塞超时_JAVA防线程阻塞(超时控制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中mvc事务_关于项目中的事务问
- 下一篇: java 初始化log4j_java