首頁 >Java >java教程 >ExecutorService 如何比 TimerTask 改進線程逾時處理?

ExecutorService 如何比 TimerTask 改進線程逾時處理?

Linda Hamilton
Linda Hamilton原創
2024-12-20 05:01:12847瀏覽

How Can ExecutorService Improve Thread Timeout Handling Over TimerTask?

執行緒逾時:替代方法

雖然 TimerTask 可以處理執行緒內的超時,但這並不是最佳解決方案。請考慮使用 ExecutorService,因為它提供了一種全面的執行緒管理和逾時方法。

ExecutorService 允許您建立可調用任務並將其提交執行。一旦提交,任務就可以透過 Future 物件進行監控。透過在 Future#get() 方法中指定逾時,您可以控制執行緒在拋出例外之前應執行多長時間。

這是一個範例實作:

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 Test {
    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 {
        // Replace this with your long-running task.
        Thread.sleep(4000);
        return "Ready!";
    }
}

在此場景中,任務運作 4 秒後完成。如果逾時增加到 5 秒,任務將完成而不會終止。如果逾時設定為較短的持續時間,則會拋出 TimeoutException 並取消任務。

要檢查長時間執行的任務中的執行緒中斷,請使用 while (!Thread.interrupted() ) { ... } 環形。透過這樣做,任務可以在必要時優雅地退出。

以上是ExecutorService 如何比 TimerTask 改進線程逾時處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn