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

从Java线程池执行器获取调试信息,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,我有一个相当复杂的软件,它大量使用多线程来计算金融提示信息,在我的市场交易接近尾声时,我的线程池队列开始膨胀,并增加到系统不再稳定的程度。为了解决这个问题,我需要获取更多关于不同类类型的Runnable的执行时间的数据,或者以某种方式标记执行时间超过x秒的类。我还试图了解,如果我在服务器上将内核过度分配给VM,会导致JVM需要一段时间才能获得用于线程执行的内核 监控队列大小非常简单,但是获取这些其他指标我在Java中没有看到任何API可以实现这一点,任何帮助都将不胜感激,这是我最后一个主要的拦截

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


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

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

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

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

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

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

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


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

Bam!你说得对,通过在你提到的两种方法中添加代码处理程序,我可以创造性地捕获我想要的度量数据。谢谢你,伙计
protected void afterExecute(Runnable r, Throwable t) { }