我有一个相当复杂的软件,它大量使用多线程来计算财务信息,在我的市场交易接近尾声时,我的线程池队列开始膨胀,并增加到系统不再稳定的程度。为了解决这个问题,我需要获得更多关于不同类类型的Runnable的执行时间的数据,或者以某种方式标记那些执行时间超过x秒的。如果我在服务器上为VM分配了过多的内核,导致JVM需要一段时间才能获得一个用于线程执行的内核,我也在尝试了解这一点。
监控队列大小非常简单,但是要获得这些其他指标,我在Java中看不到任何能够实现这一点的API,任何帮助都将不胜感激,这是我最后一个主要的拦截器!
发布于 2018-09-15 08:32:55
有无数的方法可以做到这一点,使用许多不同的库。你可以使用一些AOP方法,或者让Spring插装你的类,使用商业解决方案,等等。
如果您正在寻找一种可以手动实现的简单方法,那么这就是其中之一。
您可以子类化java.util.concurrent.ThreadPoolExecutor
并覆盖两个方法:
protected void beforeExecute(Thread t, Runnable r) { }
和
protected void afterExecute(Runnable r, Throwable t) { }
这些方法在它们的默认实现中不做任何事情,但是正如Javadoc所说,
在给定线程中执行给定Runnable之前调用的
方法。此方法由执行任务{@code r}的线程{@code t}调用,并可用于重新初始化ThreadLocals,或用于执行日志记录。
在这些方法中,您可以为Runnables收集自己的计时信息,并将它们记录到一个文件中。
https://stackoverflow.com/questions/52340466
复制相似问题