3

我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望有一个我只是想念的开箱即用的解决方案。我阅读了文档,但什么也没看到。

我的特定应用程序正在使用由 aThreadPoolExecutor支持的 a DelayQueue,尽管我不确定这是否重要。

谢谢!

4

3 回答 3

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();
    }
}
于 2011-01-05T22:07:26.233 回答
6

我认为没有可靠的方法来做到这一点。如果你想要计数,有可用的方法 (getTaskCount()/getCompletedTaskCount()) 可以提供帮助。如果您需要实际任务,那么您需要手动跟踪任务,通过覆盖 beforeExecute() 和 afterExecute() 是一种方法。

于 2011-01-05T22:20:21.757 回答
1

你真的需要在运行时知道,还是仅仅为了调试?

如果您只是在调试,请考虑查看 JVisualVM 应用程序(安装在 JDK 的“bin”目录中)。它使您可以动态检查所有正在运行的线程,因此它应该能够为您提供一些见解。

(JVisualVM 还可以执行 CPU/内存分析,具有执行和分配热点,并实时显示垃圾收集活动。)

于 2011-01-05T22:13:09.620 回答