スレッドのタイムアウトを設定する方法
最初の問い合わせで指摘されたように、スレッドの実行を制限する方法について懸念があります。時間。目標は、スレッドが無限ループに入り、親スレッドが無限に待機する可能性がある状況に対処することです。
ここで説明する解決策の 1 つは、スレッドの 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 オブジェクトは、タスクの結果を取得するメカニズムを提供します。
Future.get() メソッドは、3 秒のタイムアウト引数を指定して呼び出されます。タスクがこの時間枠内に終了すると、結果が返されます。ただし、タスクに 3 秒以上かかる場合は、TimeoutException がスローされます。 catch ブロックでは、タスクがキャンセルされ、「Terminated!」というメッセージが表示されます。
さらに、長時間実行されるタスクでは、タスクが無期限に実行されるのを防ぐために、中断を処理するためのチェックを組み込む必要があることに注意することが重要です。このチェックは Thread.interrupted().
を使用して実装できます。以上がExecutorService を使用して Java でスレッドのタイムアウトを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。