我有一个使用
创建的线程池 java.util.concurrent.ThreadPoolExecutor
无论如何我可以等到游泳池闲置吗?我的意思是所有线程都没有运行,队列中没有任何东西在等待。
我搜索了网络,所有解决方案都不适合我。例如,我不想关闭池,所以awaitTermination()不起作用。我也知道如何getTaskCount(),但我不想继续轮询池,这会浪费CPU。
这是一个大型项目,我不想更改池中运行的所有任务,所以我正在寻找一些不依赖任务合作的解决方案。所以闩锁或障碍对我不起作用。
答案 0 :(得分:5)
您可以继承ThreadPoolExecutor并使用beforeExecute和afterExecute添加挂钩,以跟踪任务执行情况,包括基本数学计算当前正在执行的任务。还可以使用getQueue()直接访问Queue。
在这些之间,您可以轻松实现您要求的跟踪。 我很好奇你的用例是什么......当它是空的时候你会对游泳池做什么?
答案 1 :(得分:3)
我想知道这是否适用于现实世界的环境。它涉及对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();
}