首頁 > Java > java教程 > 如何使用 ExecutorService 在 Java 中設定線程逾時?

如何使用 ExecutorService 在 Java 中設定線程逾時?

Barbara Streisand
發布: 2024-12-16 12:55:17
原創
606 人瀏覽過

How to Set a Timeout for a Thread in Java Using ExecutorService?

如何為執行緒設定超時

如最初詢問中所提出的,存在著一個關於如何限制執行緒執行的問題時間。目標是處理執行緒可能進入無限迴圈、導致父執行緒無限期等待的情況。

討論的一個解決方案涉及在執行緒的 run() 方法中使用 TimerTask。然而,更有效的方法是利用 ExecutorService 類別。這提供了一種在執行緒上設定超時的便捷機制。

使用 ExecutorService 的範例實作可以如下所示:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class TimeoutTest {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(4000); // Simulate a long-running task that takes 4 seconds
        return "Ready!";
    }
}
登入後複製

在此範例中,Task 類別封裝了長-運行任務。 ExecutorService.submit() 方法用於提交此任務以供執行。 Submit() 傳回的 Future 物件提供了一個檢索任務結果的機制。

使用 3 秒的超時參數來呼叫 Future.get() 方法。如果任務在此時間範圍內完成,則傳回結果。但是,如果任務花費的時間超過 3 秒,則會引發 TimeoutException。在 catch 區塊中,任務被取消並顯示「終止!」

此外,需要注意的是,在長時間運行的任務中,應該合併檢查來處理中斷,防止任務無限期地運行。此檢查可以使用 Thread.interrupted() 來實作。

以上是如何使用 ExecutorService 在 Java 中設定線程逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板