スレッドの時間制限を確立するには、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 サイトの他の関連記事を参照してください。