ホームページ >Java >&#&チュートリアル >ExecutorService は TimerTask よりもスレッド タイムアウト処理をどのように改善できるでしょうか?
スレッド タイムアウト: 代替アプローチ
TimerTask はスレッド内のタイムアウトを処理できますが、最適な解決策ではありません。 ExecutorService はスレッド管理とタイムアウトに対する包括的なアプローチを提供するため、代わりに 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 中国語 Web サイトの他の関連記事を参照してください。