web-dev-qa-db-ja.com

ExecutorでJavaのThreadを使用する必要があるのはいつですか?

エグゼキュータは、クリーンな抽象概念のようです。より堅牢なエグゼキュータに依存するのではなく、直接スレッドを使用したい場合はいつですか?

53
ripper234

一部の履歴を示すために、エグゼキューターはJavaの標準Java 1.5の一部としてのみ追加されました。したがって、ある意味でエグゼキューターは新しいより優れた抽象概念と見なすことができますRunnableタスクを処理するため。

少し単純化しすぎます...-エグゼキューターは正しく実行されるスレッドなので、優先的に使用します。

30
Pablojim

プルベースのメッセージ処理が必要な場合は、スレッドを使用します。例えば。キューは、別のスレッドのループ内のtake()-enです。たとえば、キュ​​ーを高価なコンテキストでラップします-たとえば、JDBC接続、JMS接続、単一のディスクから処理するファイルなどです。

私が呪われる前に、あなたはいくつかのシナリオを持っていますか?

編集

他の人が述べたように、ExecutorExecutorService)インターフェースは、Executorsを使用して動作を選択できるため、より多くの可能性を秘めています:スケジュール、優先、キャッシュなど。 Java 5+またはJava 1.4。

エグゼキューターフレームワークは、クラッシュしたランナブルから保護し、ワーカースレッドを自動的に再作成します。私の意見では、アプリケーションを終了する前にそれらを明示的にshutdown()およびawaitTermination()する必要があるという欠点があります。これはGUIアプリではそれほど簡単ではありません。制限付きキューを使用する場合は、RejectedExecutionHandlerを指定する必要があります。そうしないと、新しいランナブルが破棄されます。

Brian Goetz et al:Java Concurrency in Practice(2006) をご覧になるかもしれません。

7
akarnokd

Rawスレッドを使用する利点はありません。エグゼキューターには常にスレッドファクトリを提供できるため、カスタムスレッドを作成するオプションまでカバーされます。

5
skaffman

スレッド自体にはない特定の動作が必要でない限り、スレッドは使用しません。次に、スレッドを拡張して、特に必要な動作を追加します。

それ以外の場合は、RunnableまたはExecutorを使用します。

3
nojevive

まあ、私はThreadPoolExecutorがスレッドのプールを管理するためのより良いパフォーマンスを提供し、新しいスレッドのインスタンス化とメモリの割り当てのオーバーヘッドを最小化すると思いました...

そして、何千ものスレッドを起動する場合は、自分でプログラムする必要があるいくつかのキューイング機能を提供します...

スレッドとエグゼキューターはさまざまなツールであり、さまざまなシナリオで使用されます...ご覧のとおり、HashMapを使用できるのになぜArrayListを使用する必要があるのか​​と尋ねるようなものですか?彼らは違う...

3
SoulWanderer

Java.util.concurrentパッケージは、executorインターフェースを提供し、スレッドの作成に使用できます。

Executorインターフェースは、一般的なスレッド作成イディオムのドロップイン置換として設計された単一のメソッドexecuteを提供します。 rがRunnableオブジェクトであり、eが置き換えることができるExecutorオブジェクトである場合

(新しいスレッド(r))。start();

e.execute(r);

参照 ここ

3
challenger

以下のように単一スレッドの場合でも、Threadよりも Executor を優先することを常にお勧めします

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

以下のシナリオではThreadよりもExecutorを使用できます

  1. あなたのアプリケーションは限られたスレッドを必要とし、ビジネスロジックはシンプルです

  2. 単純なマルチスレッドモデルがスレッドプールなしで要件を満たす場合

  3. スレッドのライフサイクル+例外処理シナリオの管理に自信を持っており、以下の領域の低レベルAPIを利用できます:Inter thread communication, Exception handling, reincarnation of threads予期しないエラーが原因

そして最後のポイント

  1. アプリケーションがThreadPoolExecutorのさまざまな機能のカスタマイズを必要としない場合

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
    TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
    RejectedExecutionHandler handler)
    

他のすべてのケースでは、ThreadPoolExecutorに行くことができます

2
Ravindra babu