【问题标题】:Is there a simple way to tell what tasks a Java Executor is running at a given moment?有没有一种简单的方法可以告诉 Java Executor 在给定时刻正在运行哪些任务?
【发布时间】:2011-01-05 22:01:37
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: java concurrency executor executors


    【解决方案1】:

    一种简单的方法:用代码包装您的任务,该代码将调用回调信号开始新任务,传递您希望它传递的所有数据:

    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();
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 非常简单直接地回答了我的问题。谢谢!
      【解决方案3】:

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

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

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

      【讨论】:

      • 我实际上在运行时需要它,用于监控和故障排除。很好的信息,谢谢!
      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      相关资源
      最近更新 更多