Executor ではなく Java の Thread を使用する必要があるのはどのような場合ですか?
-
11-09-2019 - |
質問
Executor はきれいな抽象化のように見えます。より堅牢なエグゼキューターに依存するのではなく、Thread を直接使用したいのはどのような場合ですか?
解決
いくつかの歴史を与えるために、エグゼキュータは、唯一のJava 1.5でJava標準の一部として追加されました。だから、いくつかの方法でエグゼキュータは、Runnableをタスクに対処するための新しい、より良い抽象化として見ることができます。
オーバー簡略化のビットが...来て - エグゼキュータスレッドが右行っているが優先してそれらを使用する
。他のヒント
私はいくつかのプルベースのメッセージ処理を必要とするとき、私はスレッドを使用しています。例えば。別のスレッドでループ内JP - キュー)(テイクです。たとえば、あなたは高価なコンテキストでキューを包む - 単一のディスクから処理するために、JDBC接続、JMS接続、ファイルなどを言うことができます。
。私は呪われ得る前に、あなたには、いくつかのシナリオを持っていますか?
編集
他の人が述べたように、あなたが行動を選択するために、Executor
を使用することができますように、、ExecutorService
(Executors
)インターフェースは、より多くの可能性を有する:、予定の優先順位付け、Javaの5+またはJava 1.4のjucバックポートになどにキャッシュされました。 P>
エグゼキュータフレームワークは、クラッシュしランナブルと自動的に再作成するワーカースレッドに対する保護を持っています。 GUIアプリケーションではそれほど簡単ではありません - あなたがあなたのアプリケーションを終了する前に明示的にshutdown()
とawaitTermination()
しなければならないというのが私の意見では一つの欠点、。
あなたが有界キューを使用する場合は、RejectedExecutionHandler
または新規ランナブルが捨て取得を指定する必要があります。
生のスレッドを使用しても効果はありません。あなたは常にスレッドの工場でエグゼキューを供給することができますので、カスタムスレッドの作成にもオプションが覆われています。
あなたはスレッドを使用しないでください。その後、スレッドを拡張して、特にたかった動作を追加します。
エルスだけのRunnableまたはエグゼキュータを使用します。
は、まあ、私はそれは、新しいスレッドをインスタンス化のメモリを割り当てるのオーバーヘッドを最小限に抑え、スレッドのプールを管理するためにThreadPoolExecutorは、優れたパフォーマンスを提供することを考えて...
そして、あなたは、スレッドの数千人を起動しようとしている場合、それはあなたが自分でプログラミングしなければならないいくつかのキューイング機能を提供します...
スレッド&エグゼキュータは、私はHashMapを使用することができたとき、私はArrayListのを使うべき理由を尋ねるようなもので、私はそれを見るように異なるシナリオ...上で使用、さまざまなツールがありますか?彼らが異なっている...
java.util.concurrentパッケージは、エグゼキュータ・インターフェースを提供し、作成したスレッドを使用することができる。
キュータインタフェースは共通スレッド作成イディオムのドロップイン交換できるように設計単一の方法、実行を提供します。 rはRunnableオブジェクトであり、eは、エグゼキュータオブジェクトである場合は、交換することができます。
(新しいスレッド(R))(開始)。
タグ付き
e.execute(R)
参照してください。ここを
優先する方が常に良いです 執行者 に Thread
以下のような単一スレッドの場合でも
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
使用できます Thread
以上 Executor
以下のシナリオでは
アプリケーションに必要なスレッドは限られており、ビジネス ロジックはシンプルです
単純なマルチスレッド モデルがスレッド プールなしで要件を満たす場合
以下の領域の低レベル 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