5

を使用して作成されたスレッドプールがあります

   java.util.concurrent.ThreadPoolExecutor

プールがアイドル状態になるまで待つことはできますか? これは、すべてのスレッドが実行されておらず、キューで待機しているものがないことを意味します。

Web を検索しましたが、すべての解決策がうまくいきません。たとえば、プールをシャットダウンしたくないので、 awaitTermination() は機能しません。getTaskCount() の方法も知っていますが、CPU を浪費するプールをポーリングし続けたくありません。

これは大規模なプロジェクトであり、プールで実行されているすべてのタスクを変更したくないため、タスクの連携に依存しないソリューションを探しています。だから、ラッチやバリアは私には効きません。

4

2 に答える 2

5

ThreadPoolExecutor をサブクラス化し、beforeExecute および afterExecute でフックを追加して、現在実行中のタスクをカウントするための基本的な計算を含め、好きなようにタスクの実行を追跡できます。getQueue() を使用してキューに直接アクセスすることもできます。

これらの間に、求める追跡を簡単に実装できます。私はあなたのユースケースが何であるか興味があります...空のプールで何をしますか?

于 2009-09-30T19:35:49.533 に答える
4

これが実際の環境で機能するかどうかは疑問です。これには、サブクラスThreadPoolExecutor化して渡すことが含まれIdleListenerます。

  @Override
  protected void beforeExecute(Thread t, Runnable r)
  {
    super.beforeExecute(t, r);
    listener.working();
  }

  @Override
  protected void afterExecute(Runnable r, Throwable t)
  {
    super.afterExecute(r, t);
    long activeCount = getTaskCount() - getCompletedTaskCount();
    if (activeCount == 1) // yes, one
    {
      listener.idle();
    }
  }

インターフェース:

  interface IdleListener
  {
    void working();
    void idle();
  }
于 2009-09-30T20:26:01.303 に答える