ホームページ > Java > &#&チュートリアル > Java ExecutorServiceExecutor を適切にシャットダウンするにはどうすればよいですか?

Java ExecutorServiceExecutor を適切にシャットダウンするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-24 07:32:30
オリジナル
788 人が閲覧しました

How to Ensure Proper Shutdown of Java ExecutorServiceExecutors?

Java ExecutorService の適切なシャットダウンの確保

Java の Executor は、非同期タスクを管理する便利な方法を提供します。ただし、エグゼキュータをシャットダウンすると、特に長時間実行されているタスクや応答しないタスクを処理する場合に問題が発生する可能性があります。

問題:

コード スニペットを検討してください:

<code class="java">ExecutorService exec = Executors.newSingleThreadExecutor();
// ... create and submit tasks
exec.shutdownNow();</code>
ログイン後にコピー

すべてのタスクが完了した後、exec.isTerminated() は false のままになり、一部のタスクが適切に終了していない可能性があることを示します。

解決策:

Oracle が推奨するアプローチは shutdownAndAwaitTermination メソッドです:

<code class="java">void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown();
   try {
     // Wait for existing tasks to terminate (up to 60 seconds)
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow();
       // Wait for cancelled tasks to respond (up to 60 seconds)
       if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
           System.err.println("Pool did not terminate");
       }
     }
   } catch (InterruptedException ie) {
     pool.shutdownNow();
     Thread.currentThread().interrupt();
   }
}</code>
ログイン後にコピー

シャットダウン メソッドの概要:

  • shutdown(): 新しいタスクの送信を無効にしますが、現在のタスクの実行を許可します。
  • shutdownNow(): 実行中および待機中のすべてのタスクの強制終了を試みます。
  • awaitTermination(long timeout, TimeUnit単位) throws InterruptedException: すべてのタスクが完了するか、タイムアウトが発生するか、スレッドが中断されるまでブロックします。

適切なシャットダウン メソッドを利用することで、ExecutorService が適切に終了し、リソースが解放され、クリーンなシャットダウン。

以上がJava ExecutorServiceExecutor を適切にシャットダウンするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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