5

我有一个使用创建的线程池

   java.util.concurrent.ThreadPoolExecutor

无论如何我可以等到游泳池闲置吗?我的意思是所有线程都没有运行,队列中没有任何东西在等待。

我在网上搜索,所有解决方案都对我不起作用。例如,我不想关闭池,所以 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 回答