【问题标题】:Getting Debugging Information From a Java Thread Pool Executor从 Java 线程池执行器获取调试信息
【发布时间】:2019-02-19 18:26:24
【问题描述】:

我有一个相当复杂的软件,它大量使用多线程来计算金融报价,在我的市场交易即将结束时,我的线程池队列开始膨胀并增加到系统不再运行的程度稳定的。为了解决这个问题,我需要获取更多关于不同类类型的 Runnable 执行多长时间的数据,或者以某种方式标记执行时间超过 x 秒的那些。如果我在我的服务器上为 VM 过度分配内核,导致 JVM 需要一段时间来获取线程执行的内核,我也试图了解这一点。

监控队列大小非常简单,但是获得这些其他指标我看不到任何 Java 中的 API 可以实现这一点,任何帮助将不胜感激,这是我最后的主要障碍!

【问题讨论】:

    标签: java multithreading concurrency threadpool


    【解决方案1】:

    有无数种方法可以做到这一点,使用许多不同的库。您可以使用一些 AOP 方法,或者让 Spring 检测您的类、使用商业解决方案等。

    如果您正在寻找一种可以手动实现的简单方法,那么这就是其中之一。

    您可以继承java.util.concurrent.ThreadPoolExecutor 并覆盖两个方法:

    protected void beforeExecute(Thread t, Runnable r) { }
    

    protected void afterExecute(Runnable r, Throwable t) { }
    

    这些方法在其默认实现中不做任何事情,但正如 Javadoc 所说,

    在执行给定的 Runnable 之前调用的方法 给定线程。此方法由线程 {@code t} 调用 将执行任务 {@code r}​​,并可用于重新初始化 ThreadLocals,或执行日志记录

    在这些方法中,您可以收集自己的 Runnable 计时信息并将它们记录到文件中。

    【讨论】:

    • 嘭!你对我来说是正确的,我可以通过在你提到的两种方法中添加代码处理程序来创造性地捕获我想要的度量数据。谢谢好友
    猜你喜欢
    • 2014-08-27
    • 2017-12-29
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多