スレッド タイムアウト: TimerTask の代替ソリューション
事前定義された時間枠内でスレッドを実行する必要があるシナリオでは、メソッドを探すことができます。実行時間を制限します。一般的に検討されているアプローチの 1 つは、スレッドの run() メソッド内で TimerTask を利用することです。ただし、この目的を達成するには、より効果的なソリューションが存在します。
ExecutorService: 堅牢な代替手段
ExecutorService は、TimerTask と比較してスレッド タイムアウトを管理するための優れたオプションを提供します。このクラスは、複数のスレッドを同時に実行および制御するための集中化されたアプローチを提供します。 Future オブジェクトを使用すると、非同期タスクの結果を取得したり、発生する可能性のある例外を処理したりできます。
ExecutorService を使用した時間指定実行の実装
ExecutorService を使用して確立するサンプル コードスレッド実行のタイムアウト:
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();
この場合たとえば、Future#get() メソッドを使用してタスクの結果を取得します。指定されたタイムアウト (この場合は 3 秒) 以内にタスクが完了しない場合、TimeoutException がスローされます。その後、タスクをキャンセルしてスレッドを終了できます。
長時間実行タスクの処理
スレッド内で長時間実行タスクを扱う場合は、次のことを組み込むことが重要です。割り込みを定期的にチェックするロジック。これにより、タスクが応答しなくなったり無限ループに入ったりした場合にタスクを終了できることが保証されます。次のコード スニペットは、この手法を示しています。
while (!Thread.interrupted()) { // Your long-running task logic here. }
これらの概念を組み込むことで、スレッド タイムアウトを効果的に実装でき、タイムリーな実行と、タスクの実行中に発生する可能性のある潜在的な問題の処理が保証されます。
以上がTimerTask を超えてスレッド タイムアウトを効果的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。