代码之家  ›  专栏  ›  技术社区  ›  ZZ Coder

如何判断Java中线程池是否空闲

  •  5
  • ZZ Coder  · 技术社区  · 15 年前

    我使用创建了一个线程池

       java.util.concurrent.ThreadPoolExecutor
    

    不管怎样,我能等到游泳池闲置吗?我的意思是所有的线程都没有运行,队列中没有等待的内容。

    我在网上搜索,所有的解决方案都不适合我。例如,我不希望关闭池,这样等待终止()就不会工作。我也知道如何获取askCount(),但我不想继续轮询池,这会浪费CPU。

    这是一个大型项目,我不希望更改池中运行的所有任务,因此我正在寻找一些不依赖任务合作的解决方案。所以闩锁或栅栏对我来说不起作用。

    2 回复  |  直到 13 年前
        1
  •  5
  •   TREE    15 年前

    您可以将threadpoolexecutor子类化,并添加带有beforeexecute和afterexecute的挂钩,以跟踪任务的执行情况,不管您喜欢什么,包括计算当前执行任务的基本数学。还可以使用getQueue()直接访问队列。

    在这两者之间,你可以很容易地实现你要求的跟踪。 我很好奇你的用例是什么…当泳池是空的时候,你会怎么处理它?

        2
  •  3
  •   eljenso    15 年前

    我想知道这在现实世界中是否可行。它涉及到子类化 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();
      }