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

12
Java ExecutorServiceタスクからの例外の処理
JavaのThreadPoolExecutorクラスを使用して、多数の重いタスクを一定数のスレッドで実行しようとしています。各タスクには、例外のために失敗する可能性のある多くの場所があります。 サブクラス化ThreadPoolExecutorしafterExecute、タスクの実行中に発生したキャッチされない例外を提供することになっているメソッドをオーバーライドしました。しかし、私はそれを機能させることができないようです。 例えば: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if(t != null) { System.out.println("Got an …


13
サイズ制限付きのキャッシュスレッドプールを作成することはできませんか?
作成できるスレッドの数に制限を設けて、キャッシュされたスレッドプールを作成することは不可能のようです。 静的なExecutors.newCachedThreadPoolが標準Javaライブラリにどのように実装されているかを次に示します。 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッドプールを作成します。 new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); これを使用して3つのタスクを送信すると、すべてが正常になります。さらにタスクを送信すると、拒否された実行例外が発生します。 これを試す: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); すべてのスレッドが順次実行されます。つまり、スレッドプールがタスクを処理するために複数のスレッドを作成することはありません。 これはThreadPoolExecutorの実行メソッドのバグですか?または、これは意図的なものですか?または他の方法がありますか? 編集:私はキャッシュされたスレッドプールとまったく同じものを求めます(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続けることができますスレッドの制限に達しました。sjleeの回答によると、これは不可能です。ThreadPoolExecutorのexecute()メソッドを見ると、実際には不可能です。SwingWorkerと同じようにThreadPoolExecutorをサブクラス化してexecute()をオーバーライドする必要がありますが、SwingWorkerがそのexecute()で行うことは完全なハックです。


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.