3

現在、仕事で先物を使用して非同期スレッドを実行しています。その機能を「cachedThreadPool」に似たものにしたいだけでなく、次の 2 つのことも行いたいと考えています。

  1. スレッドが正常に完了するたびに、許可されるスレッドの最大数を増やします。

  2. スレッドが例外またはタイムアウトをスローした場合、許可されるスレッドの最大数を減らします。

これはカスタムで可能ThreadPoolExecutorですか?私はこの方法でエグゼキューターを使用するのは初めてなので、正しい方向に私を向けることは、これを解決するのに非常に役立ちます.

4

1 に答える 1

2

スレッド プールの動的なサイズ変更は、慎重に検討する必要があります。タイムアウトがあり、応答がスレッド数を減らすことである場合、タスクが並列化可能であると仮定すると、問題が悪化する可能性があります。

とにかく、タスクが例外をスローしたときにプールのサイズを変更し、タスクが正常に完了した場合はプールのサイズを大きくするコードを次に示します。

class ManagedThreadPoolExecutor extends ThreadPoolExecutor {
      @Override
      protected void afterExecute(Runnable r, Throwable t) {
           if(t != null)
                setMaximumPoolSize(getMaximumPoolSize()-1);
           else
                setMaximumPoolSize(getMaximumPoolSize()+1);

      }
}
于 2015-03-25T17:14:09.293 に答える