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