ホームページ > Java > &#&チュートリアル > Java でスレッドを正確にタイムアウトするにはどうすればよいですか?

Java でスレッドを正確にタイムアウトするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-19 00:18:16
オリジナル
837 人が閲覧しました

How to Precisely Timeout a Thread in Java?

スレッドを正確にタイムアウトします

スレッドの時間制限を確立するには、Timer ではなく ExecutorService の使用を検討してください。 ExecutorService は、指定された期間内でスレッドの実行を制御するための柔軟なソリューションを提供します。

ExecutorService を使用した洗練されたコード スニペットは次のとおりです。

import java.util.concurrent.*;

public class ThreadTimeout {

    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();
    }

    static class Task implements Callable<String> {
        @Override
        public String call() throws Exception {
            // Your long-running task should go here.
            return "Ready!";
        }
    }
}
ログイン後にコピー

Future#get() を活用することで、タスクのタイムアウト。タスクがその時間内に終了すると、期待どおりに結果が取得されます。ただし、割り当てられた時間内に完了しない場合は、catch ブロックが実行され、タスクをキャンセルできます。

sleep() の使用法の説明

提供された例に sleep() が含まれているのは、デモンストレーションのみを目的としています。これは、SSCCE 内で長時間実行されるタスクをシミュレートすることを目的としています。実際のシナリオでは、sleep() を目的の長時間実行タスクに置き換えます。

潜在的なデッドロックを回避するには、スレッドが中断されているかどうかを長時間実行タスク内で定期的に確認することが重要です。次のコード スニペット:

while (!Thread.interrupted()) {
    // Perform your long-running task here.
}
ログイン後にコピー

この系統的なアプローチにより、スレッドが割り込みリクエストに即座に応答し、タイムアウト時に正常に終了することが保証されます。

以上がJava でスレッドを正確にタイムアウトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート