0

Java Concurrency APIは、ビルドするためExecutorExecutorServiceインターフェースを提供し、いくつかの具体的な実装(ThreadPoolExecutorおよびScheduledThreadPoolExecutor)とともに出荷されます。

私はJava並行性にまったく慣れておらず、非常によく似たいくつかの質問に対する答えを見つけるのに苦労しています。これらすべての小さな質問でSOを乱雑にするのではなく、私はそれらをまとめることにしました。おそらく、それらすべてに一挙に答える方法があるからです(おそらく、ここで全体像を見ていないためです)。

  • Executor独自の/を実装するのが一般的な方法ExecutorServiceですか?上記の2つのコンクリーションを使用する代わりに、どのような場合にこれを行いますか?どのような場合に、2つのコンクリーションは「自家製」のものよりも好ましいですか?
  • すべての同時コレクションがにどのように関連しているかわかりませんExecutor。たとえば、送信されたタスクをキューに入れるためThreadPoolExecutorに、たとえば、内部で使用しますか?ConcurrentLinkedQueueそれとも、あなた(API開発者)は、たとえばConcurrentLinkedQueue並列化されたrun()メソッド内で選択して使用することになっていますか?基本的に、sが内部で使用する並行コレクションはありExecutorますか、それとも非ブロッキングアルゴリズムの作成を支援するためにそれらを使用しますか?
  • Executor(送信されたタスクを格納するために)内部で使用する同時コレクションを構成できますか?これは一般的な方法ですか?

前もって感謝します!

4

1 に答える 1

3

独自のExecutor/ExecutorServiceを実装するのが一般的な方法ですか?

いいえ。これを行う必要はなく、並行性パッケージをしばらく使用しています。これらのクラスの複雑さと、それらを「間違った」ものにすることに関するパフォーマンスへの影響は、そのようなプロジェクトに着手する前に、それについて本当に慎重に考える必要があることを意味します。

自分のエグゼキュータサービスを実装する必要があると感じたのは、「自己実行」エグゼキュータサービスを実装したいときだけでした。それは友人が私にそれをする方法があることを示すまででしたRejectedExecutionHandler

の動作を微調整したかった唯一の理由はThreadPoolExecutor、max-threadsまでのすべてのスレッドを開始してからジョブをキューに固定することでした。デフォルトでは、ThreadPoolExecutor最小スレッドを開始してから、別のスレッドを開始する前にキューを埋めます。私が期待したり望んでいることではありません。しかし、JDKからコードをコピーして変更するだけで、最初から実装することはありません。

すべての同時コレクションがエグゼキュータにどのように関連しているかわかりません。たとえば、ThreadPoolExecutorは、送信されたタスクをキューに入れるために、たとえば、内部でConcurrentLinkedQueueを使用しますか?

ヘルパーメソッドの1つを使用している場合は、Executorsこれについて心配する必要はありません。自分でインスタンス化する場合は、使用ThreadPoolExecutorするを提供BlockingQueueします。

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
           0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}

対:

 ExecutorService threadPool = 
     new ThreadPoolExecutor(minThreads, maxThreads, 0L, TimeUnit.MILLISECONDS,
            new SynchronousQueue<Runnable>());

エグゼキュータが内部で(送信されたタスクを保存するために)使用する同時コレクションを構成できますか?これは一般的な方法ですか?

最後の答えを参照してください。

于 2012-06-29T18:31:35.920 に答える