タグ付けされた質問 「blockingqueue」

9
キューに入れる前にThreadPoolExecutorでスレッドを最大に増やす方法は?
私はしばらくの間、多くの人が使用するスレッドプールThreadPoolExecutorをサポートするデフォルトの動作にイライラしてきましたExecutorService。Javadocsから引用するには: corePoolSizeを超えてmaximumPoolSize未満のスレッドが実行されている場合、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。 これは、次のコードでスレッドプールを定義した場合、が無制限であるため、2番目のスレッドを開始しないことを意味しますLinkedBlockingQueue。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); 制限付きキューがあり、キューがいっぱいの場合のみ、コア番号を超えるスレッドが開始されます。多くのジュニアJavaマルチスレッドプログラマーは、このの動作に気付いていませんThreadPoolExecutor。 これで、これが最適ではない特定のユースケースがあります。私は自分のTPEクラスを書かずに、それを回避する方法を探しています。 私の要件は、おそらく信頼できないサードパーティにコールバックするWebサービスに対するものです。 コールバックをWebリクエストと同期させたくないので、スレッドプールを使用します。 私は通常、1分間に数回これらを取得するのでnewFixedThreadPool(...)、ほとんどが休止状態である多数のスレッドを使用したくありません。 頻繁にこのトラフィックのバーストが発生し、スレッド数をいくつかの最大値(50としましょう)にスケールアップしたいと思います。 すべてのコールバックを最善の方法で試行する必要があるので、50を超える追加のコールバックをキューに入れますnewCachedThreadPool()。 スレッドを開始する前にThreadPoolExecutorキューを制限していっぱいにする必要があるこの制限を回避するにはどうすればよいですか?タスクをキューに入れる前に、より多くのスレッドを開始するにはどうすればよいですか? 編集: @FlavioはThreadPoolExecutor.allowCoreThreadTimeOut(true)、コアスレッドをタイムアウトさせて終了させるためにを使用することについて良い点を示しています。私はそれを考えましたが、それでもコアスレッド機能が欲しかったです。可能であれば、プール内のスレッド数がコアサイズを下回らないようにしたいと思いました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.