线程池中的线程状态

时间:2012-01-31 07:40:48

标签: java multithreading

我想监视ThreadLocals中的内存泄漏。要获取所有线程本地对象,我使用此处的代码http://blog.igorminar.com/2009/03/identifying-threadlocal-memory-leaks-in.html。此代码使用反射来提取当前线程上的所有线程本地。

我想要一个监视所有线程的后台线程。

运行所有线程(ThreadGroup上的递归调用)很简单。但是,我需要知道哪些线程当前没有运行,仍然使用线程本地对象。

例如: 线程A使用LocalThread A1。线程完成并返回到容器的线程池后,应该释放A1。 线程M是我的监控线程。它运行在所有线程上,并找到线程A.因此,它需要知道A是否因为上下文切换而当前没有运行(并且是这种情况,A1不是泄漏),或者A当前没有运行,因为它被送回了游泳池。

我如何区分案件?

BTW,我的监控类需要支持任何平台(app服务器,web服务器,标准java,任何供应商,java 1.5及以上版本)。这意味着我需要知道线程是否处于活动状态,无论容器是否使用Executors框架或旧线程机制....

2 个答案:

答案 0 :(得分:3)

您可以使用

for(Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces()) {
    if (waitingOnTheRightLine(entry))
        checkThreadLocalValues(entry);
}

这将检测线程所在的确切行,以检查其未运行及其在已知点的等待。

答案 1 :(得分:1)

示例代码,希望它有所帮助:

    Thread t = getYourThread();
    if(t.getState() != Thread.State.RUNNABLE)  {
       //currently the thread is not running...
    }