Java實(shí)現(xiàn)任務(wù)超時處理方法
任務(wù)超時處理是比較常見的需求,比如在進(jìn)行一些比較耗時的操作(如網(wǎng)絡(luò)請求)或者在占用一些比較寶貴的資源(如數(shù)據(jù)庫連接)時,我們通常需要給這些操作設(shè)置一個超時時間,當(dāng)執(zhí)行時長超過設(shè)置的閾值的時候,就終止操作并回收資源。Java中對超時任務(wù)的處理有兩種方式:一種是基于異步任務(wù)結(jié)果的超時獲取,一種則是使用延時任務(wù)來終止超時操作。下文將詳細(xì)說明。
一、基于異步任務(wù)結(jié)果的超時獲取
基于異步任務(wù)結(jié)果的獲取通常是跟線程池一起使用的,我們向線程池提交任務(wù)時會返回一個Future對象,在調(diào)用Future的get方法時,可以設(shè)置一個超時時間,如果超過設(shè)置的時間任務(wù)還沒結(jié)束,就拋出異常。接下來看代碼:
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("任務(wù)被中斷。");
}
return "OK";
}
});
try {
String result = future.get(2, TimeUnit.SECONDS);
} catch (InterruptedException |ExecutionException | TimeoutException e) {
future.cancel(true);
System.out.println("任務(wù)超時。");
}finally {
System.out.println("清理資源。");
}
}}
運(yùn)行代碼,輸出如下:

二、使用延時任務(wù)來終止超時操作
還有一種實(shí)現(xiàn)任務(wù)超時處理的思路是在提交任務(wù)之前先設(shè)置一個定時器,這個定時器會在設(shè)置的時間間隔之后去取消任務(wù)。當(dāng)然如果任務(wù)在規(guī)定的時間內(nèi)完成了,要記得取消定時器。首先來看一下我們的工作線程:
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("任務(wù)被中斷。");
}
}
這個工作線程每隔一秒鐘會去檢查下isStop變量,因此我們可以通過isStop變量來取消任務(wù)。至于取消任務(wù)的邏輯我們放在了定時器里面,代碼如下:
public class CancelTask implements Runnable {
private RunningTask runningTask;
public CancelTask(RunningTask runningTask) {
this.runningTask = runningTask;
}
@Override
public void run() {
runningTask.stop();
}
}
可以看到,該定時器的作用就是在一定的時間之后去中斷工作線程的運(yùn)行。接下來測試一下:
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);
}
}
}
運(yùn)行結(jié)果如下:

可以看到,任務(wù)在超時之后也可以被取消。
總結(jié)
以上所述是小編給大家介紹的Java實(shí)現(xiàn)任務(wù)超時處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Java使用JaCoCo進(jìn)行代碼覆蓋率分析的操作指南
JaCoCo是一個開源的 Java 代碼覆蓋率工具,廣泛應(yīng)用于測試過程中,它可以幫助開發(fā)者分析測試代碼的覆蓋情況,在本文中,我們將介紹 JaCoCo 的基本功能、如何集成到 Maven 項(xiàng)目中,以及通過具體案例展示如何生成覆蓋率報告,需要的朋友可以參考下2025-02-02
servlet之session工作原理簡介_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了servlet之session工作原理簡介,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
java 抓取網(wǎng)頁內(nèi)容實(shí)現(xiàn)代碼
這篇文章主要介紹了java 抓取網(wǎng)頁內(nèi)容實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-02-02
Spring中的HandlerMapping執(zhí)行流程詳解
這篇文章主要介紹了Spring中的HandlerMapping執(zhí)行流程詳解,HandlerMapping在Spring MVC框架的jar包下面,他是處理映射器,為用戶發(fā)送的請求找到合適的Handler Adapter,它將會把請求映射為HandlerExecutionChain對象,需要的朋友可以參考下2023-08-08
Spring?Security?基于URL的權(quán)限判斷源碼解析
這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實(shí)現(xiàn)自己的基于請求Url的授權(quán)只需自定義一個?AccessDecisionManager即可,接下來跟隨小編一起看看實(shí)現(xiàn)代碼吧2021-12-12

