有一种简单的方法可以告诉Java Executor在给定时刻运行的任务吗?

时间:2011-01-05 22:01:37

标签: java concurrency executor executors

我确信我可以将一些东西放在一起,这将使我能够解决这个问题,但我希望有一个开箱即用的解决方案,我只是错过了。我阅读了文档,但我没有看到任何内容。

我的特定应用使用ThreadPoolExecutor支持DelayQueue,但我不确定是否重要。

谢谢!

3 个答案:

答案 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 /内存分析,执行和分配热点,并实时显示垃圾收集活动。)