我确信我可以将一些东西放在一起,这将使我能够解决这个问题,但我希望有一个开箱即用的解决方案,我只是错过了。我阅读了文档,但我没有看到任何内容。
我的特定应用使用ThreadPoolExecutor
支持DelayQueue
,但我不确定是否重要。
谢谢!
答案 0 :(得分:10)
一个简单的方法:用代码包装你的任务,这将调用新任务的回调信号开始,传递你想要的所有数据:
interface StartTaskWatcher {
void taskStarted(Object data);
}
class StartTaskSignalingWrapper implements Runnable {
private final Runnable task;
private final String taskDescription;
private final StartTaskWatcher startTaskWatcher;
StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) {
this.task = task;
this.taskDescription = taskDescription;
this.startTaskWatcher = startTaskWatcher;
}
public void run() {
startTaskWatcher.taskStarted(taskDescription);
task.run();
}
}
答案 1 :(得分:6)
我认为没有可靠的方法来做到这一点。如果你想要计数,有可用的方法(getTaskCount()/ getCompletedTaskCount())有帮助。如果您需要实际任务,那么AFAIK需要手动跟踪任务,通过覆盖beforeExecute()和afterExecute()是单向的。
答案 2 :(得分:1)
你真的需要在运行时知道,还是只是为了调试?
如果您只是调试,请考虑查看JVisualVM应用程序(安装在JDK的“bin”目录中)。它允许您动态检查所有正在运行的线程,因此它应该能够为您提供一些见解。
(JVisualVM还可以执行CPU /内存分析,执行和分配热点,并实时显示垃圾收集活动。)