エグゼキュータは、クリーンな抽象概念のようです。より堅牢なエグゼキュータに依存するのではなく、直接スレッドを使用したい場合はいつですか?
一部の履歴を示すために、エグゼキューターはJavaの標準Java 1.5の一部としてのみ追加されました。したがって、ある意味でエグゼキューターは新しいより優れた抽象概念と見なすことができますRunnableタスクを処理するため。
少し単純化しすぎます...-エグゼキューターは正しく実行されるスレッドなので、優先的に使用します。
プルベースのメッセージ処理が必要な場合は、スレッドを使用します。例えば。キューは、別のスレッドのループ内のtake()-enです。たとえば、キューを高価なコンテキストでラップします-たとえば、JDBC接続、JMS接続、単一のディスクから処理するファイルなどです。
私が呪われる前に、あなたはいくつかのシナリオを持っていますか?
編集:
他の人が述べたように、Executor
(ExecutorService
)インターフェースは、Executors
を使用して動作を選択できるため、より多くの可能性を秘めています:スケジュール、優先、キャッシュなど。 Java 5+またはJava 1.4。
エグゼキューターフレームワークは、クラッシュしたランナブルから保護し、ワーカースレッドを自動的に再作成します。私の意見では、アプリケーションを終了する前にそれらを明示的にshutdown()
およびawaitTermination()
する必要があるという欠点があります。これはGUIアプリではそれほど簡単ではありません。制限付きキューを使用する場合は、RejectedExecutionHandler
を指定する必要があります。そうしないと、新しいランナブルが破棄されます。
Brian Goetz et al:Java Concurrency in Practice(2006) をご覧になるかもしれません。
Rawスレッドを使用する利点はありません。エグゼキューターには常にスレッドファクトリを提供できるため、カスタムスレッドを作成するオプションまでカバーされます。
スレッド自体にはない特定の動作が必要でない限り、スレッドは使用しません。次に、スレッドを拡張して、特に必要な動作を追加します。
それ以外の場合は、RunnableまたはExecutorを使用します。
まあ、私はThreadPoolExecutorがスレッドのプールを管理するためのより良いパフォーマンスを提供し、新しいスレッドのインスタンス化とメモリの割り当てのオーバーヘッドを最小化すると思いました...
そして、何千ものスレッドを起動する場合は、自分でプログラムする必要があるいくつかのキューイング機能を提供します...
スレッドとエグゼキューターはさまざまなツールであり、さまざまなシナリオで使用されます...ご覧のとおり、HashMapを使用できるのになぜArrayListを使用する必要があるのかと尋ねるようなものですか?彼らは違う...
Java.util.concurrentパッケージは、executorインターフェースを提供し、スレッドの作成に使用できます。
Executorインターフェースは、一般的なスレッド作成イディオムのドロップイン置換として設計された単一のメソッドexecuteを提供します。 rがRunnableオブジェクトであり、eが置き換えることができるExecutorオブジェクトである場合
(新しいスレッド(r))。start();
と
e.execute(r);
参照 ここ
以下のように単一スレッドの場合でも、Thread
よりも Executor を優先することを常にお勧めします
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
以下のシナリオではThread
よりもExecutor
を使用できます
あなたのアプリケーションは限られたスレッドを必要とし、ビジネスロジックはシンプルです
単純なマルチスレッドモデルがスレッドプールなしで要件を満たす場合
スレッドのライフサイクル+例外処理シナリオの管理に自信を持っており、以下の領域の低レベルAPIを利用できます:Inter thread communication, Exception handling, reincarnation of threads
予期しないエラーが原因
そして最後のポイント
アプリケーションがThreadPoolExecutor
のさまざまな機能のカスタマイズを必要としない場合
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
他のすべてのケースでは、ThreadPoolExecutor
に行くことができます