【发布时间】:2011-01-05 22:01:37
【问题描述】:
我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望我只是缺少一个开箱即用的解决方案。我阅读了文档,但没有看到任何内容。
我的特定应用正在使用由DelayQueue 支持的ThreadPoolExecutor,尽管我不确定这是否重要。
谢谢!
【问题讨论】:
标签: java concurrency executor executors
我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望我只是缺少一个开箱即用的解决方案。我阅读了文档,但没有看到任何内容。
我的特定应用正在使用由DelayQueue 支持的ThreadPoolExecutor,尽管我不确定这是否重要。
谢谢!
【问题讨论】:
标签: java concurrency executor executors
一种简单的方法:用代码包装您的任务,该代码将调用回调信号开始新任务,传递您希望它传递的所有数据:
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/内存分析,具有执行和分配热点,并实时显示垃圾收集活动。)
【讨论】: