Executor ではなく Java の Thread を使用する必要があるのはどのような場合ですか?

StackOverflow https://stackoverflow.com/questions/1094867

質問

Executor はきれいな抽象化のように見えます。より堅牢なエグゼキューターに依存するのではなく、Thread を直接使用したいのはどのような場合ですか?

役に立ちましたか?

解決

いくつかの歴史を与えるために、エグゼキュータは、唯一のJava 1.5でJava標準の一部として追加されました。だから、いくつかの方法でエグゼキュータは、Runnableをタスクに対処するための新しい、より良い抽象化として見ることができます。

オーバー簡略化のビットが...来て - エグゼキュータスレッドが右行っているが優先してそれらを使用する

他のヒント

私はいくつかのプルベースのメッセージ処理を必要とするとき、私はスレッドを使用しています。例えば。別のスレッドでループ内JP - キュー)(テイクです。たとえば、あなたは高価なコンテキストでキューを包む - 単一のディスクから処理するために、JDBC接続、JMS接続、ファイルなどを言うことができます。

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

編集

他の人が述べたように、あなたが行動を選択するために、Executorを使用することができますように、

ExecutorServiceExecutors)インターフェースは、より多くの可能性を有する:、予定の優先順位付け、Javaの5+またはJava 1.4のjucバックポートになどにキャッシュされました

エグゼキュータフレームワークは、クラッシュしランナブルと自動的に再作成するワーカースレッドに対する保護を持っています。 GUIアプリケーションではそれほど簡単ではありません - あなたがあなたのアプリケーションを終了する前に明示的にshutdown()awaitTermination()しなければならないというのが私の意見では一つの欠点、。 あなたが有界キューを使用する場合は、RejectedExecutionHandlerまたは新規ランナブルが捨て取得を指定する必要があります。

実践でのJava並行処理(2006)の

あなたはブライアン・ゲッツらを見ているかもしれません

生のスレッドを使用しても効果はありません。あなたは常にスレッドの工場でエグゼキューを供給することができますので、カスタムスレッドの作成にもオプションが覆われています。

あなたがスレッド自体には見られない、より具体的な行動を必要としない限り、

あなたはスレッドを使用しないでください。その後、スレッドを拡張して、特にたかった動作を追加します。

エルスだけのRunnableまたはエグゼキュータを使用します。

は、まあ、私はそれは、新しいスレッドをインスタンス化のメモリを割り当てるのオーバーヘッドを最小限に抑え、スレッドのプールを管理するためにThreadPoolExecutorは、優れたパフォーマンスを提供することを考えて...

そして、あなたは、スレッドの数千人を起動しようとしている場合、それはあなたが自分でプログラミングしなければならないいくつかのキューイング機能を提供します...

スレッド&エグゼキュータは、私はHashMapを使用することができたとき、私はArrayListのを使うべき理由を尋ねるようなもので、私はそれを見るように異なるシナリオ...上で使用、さまざまなツールがありますか?彼らが異なっている...

優先する方が常に良いです 執行者Thread 以下のような単一スレッドの場合でも

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

使用できます Thread 以上 Executor 以下のシナリオでは

  1. アプリケーションに必要なスレッドは限られており、ビジネス ロジックはシンプルです

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

  3. 以下の領域の低レベル API を使用して、スレッドのライフサイクルと例外処理シナリオを確実に管理できます。 Inter thread communication, Exception handling, reincarnation of threads 予期せぬエラーのため

そして最後にもう1点

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

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

他のすべての場合は、次のようにすることができます ThreadPoolExecutor

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top