我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望有一个我只是想念的开箱即用的解决方案。我阅读了文档,但什么也没看到。
我的特定应用程序正在使用由 aThreadPoolExecutor
支持的 a DelayQueue
,尽管我不确定这是否重要。
谢谢!
我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望有一个我只是想念的开箱即用的解决方案。我阅读了文档,但什么也没看到。
我的特定应用程序正在使用由 aThreadPoolExecutor
支持的 a DelayQueue
,尽管我不确定这是否重要。
谢谢!
一种简单的方法:用代码包装您的任务,该代码将调用回调信号开始新任务,传递您希望它传递的所有数据:
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();
}
}
我认为没有可靠的方法来做到这一点。如果你想要计数,有可用的方法 (getTaskCount()/getCompletedTaskCount()) 可以提供帮助。如果您需要实际任务,那么您需要手动跟踪任务,通过覆盖 beforeExecute() 和 afterExecute() 是一种方法。
你真的需要在运行时知道,还是仅仅为了调试?
如果您只是在调试,请考虑查看 JVisualVM 应用程序(安装在 JDK 的“bin”目录中)。它使您可以动态检查所有正在运行的线程,因此它应该能够为您提供一些见解。
(JVisualVM 还可以执行 CPU/内存分析,具有执行和分配热点,并实时显示垃圾收集活动。)