从 Java 线程池执行器获取调试信息

Dun*_*ebs 4 java concurrency multithreading threadpool

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

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

Erw*_*idt 5

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

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

您可以子类化java.util.concurrent.ThreadPoolExecutor并重写两个方法:

protected void beforeExecute(Thread t, Runnable r) { }
Run Code Online (Sandbox Code Playgroud)

protected void afterExecute(Runnable r, Throwable t) { }
Run Code Online (Sandbox Code Playgroud)

这些方法在其默认实现中不执行任何操作,但正如 Javadoc 所说,

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

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