7

他のファクトリ メソッドではなく、このファクトリ メソッドを使用する方が便利な実際の例を教えてください。

newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor()

無制限のキューで動作する単一のワーカー スレッドを使用する Executor を作成します。(ただし、シャットダウン前の実行中に障害が発生したためにこの単一のスレッドが終了した場合、後続のタスクを実行するために必要に応じて新しいスレッドが代わりに使用されることに注意してください。)タスクは順次実行されることが保証されており、複数のタスクがアクティブになることはありません。いつでも。それ以外は同等の newFixedThreadPool(1) とは異なり、返されたエグゼキュータは、追加のスレッドを使用するように再構成できないことが保証されています。

前もって感謝します。

4

4 に答える 4

14

newSingleThreadExecutor()[ファクトリ メソッド] を使用する方が他の方法よりも便利な実際の例を教えてください。

固定またはキャッシュされたスレッド プールではなく、シングル スレッドのスレッド プールをいつ使用するかについて質問されていると思います。

実行するタスクが多数ある場合にシングル スレッド エグゼキュータを使用しますが、実行するスレッドは 1 つだけにします。もちろん、これは 1 の固定スレッド プールを使用するのと同じです。多くの場合、これは並行して実行する必要がなく、バックグラウンド タスクであり、システム リソース (CPU、メモリ、IO) をあまり消費したくないためです。オブジェクトとしてさまざまなタスクを処理したいので、Callable最適ですが、必要なのはそれらを実行するための単一のスレッドだけです。RunnableExecutorService

たとえば、私は春に注入する多くのタイマー タスクを持っています。2 種類のタスクがあり、「短期」タスクは単一のスレッド プールで実行されます。私のシステムには数百のスレッドがありますが、それらすべてを実行するスレッドは 1 つしかありません。ディスク容量のチェック、ログのクリーンアップ、統計のダンプなどの日常的なタスクを実行します。時間が重要なタスクについては、キャッシュされたスレッド プールで実行します。

もう 1 つの例は、一連のパートナー統合タスクがある場合です。それらは非常に時間がかからず、実行頻度もかなり低く、他のシステム スレッドと競合させたくないため、単一のスレッド化されたエグゼキュータで実行されます。

3 番目の例は、各状態ミューテーターがジョブをある状態から別の状態に移動Runnableし、単一のスレッド プールに として登録される有限状態マシンを使用することです。何百ものミューテーターがありますが、ある時点で有効なタスクは 1 つだけなので、タスクに複数のスレッドを割り当てる意味はありません。

于 2013-05-29T13:00:40.823 に答える
3

すでに述べた理由とは別に、順序の保証が必要な場合、つまり、サブミットされているタスクが常にサブミットされた順序で実行されるようにする必要がある場合は、単一のスレッド化されたエグゼキューターを使用する必要があります。

于 2014-06-20T07:04:19.383 に答える
2

Executors.newSingleThreadExecutor()との違いExecutors.newFixedThreadPool(1)はわずかですが、ライブラリ API を設計するときに役立ちます。ExecutorService返された をライブラリのユーザーに公開し、エグゼキュータが単一のスレッドを使用する場合にのみライブラリが正しく動作する場合 (タスクはスレッド セーフではありません)、 を使用することをお勧めしますExecutors.newSingleThreadExecutor()。そうしないと、ライブラリのユーザーが次のようにしてライブラリを壊す可能性があります。

ExecutorService e = myLibrary.getBackgroundTaskExecutor();
((ThreadPoolExecutor)e).setCorePoolSize(10);

、これは不可能ですExecutors.newSingleThreadExecutor()

于 2013-05-29T14:35:45.137 に答える
0

タスクの実行を延期するだけで便利な軽量サービスが必要で、ジョブに 1 つのスレッドのみが使用されるようにしたい場合に役立ちます。

于 2013-05-29T13:01:19.863 に答える