package com.ikokoon.toolkit; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import org.apache.log4j.Logger; /** * During the testing with object databases for persistence it looked like the threads were getting locked, and in fact even this thread stopped so * finally oodb couldn't be used. Still no resolution on that. * * This thread iterates over the threads that can be locked and prints out the info on them, if there are any of course. * * @author Michael Couck * @since 15.10.09 * @version 01.00 */ public class ThreadDeadLockDetector implements Runnable { private static final long SLEEP = 10000; private Logger logger = Logger.getLogger(ThreadDeadLockDetector.class); /** * {@inheritDoc} */ public void run() { while (true) { try { Thread.sleep(SLEEP); } catch (InterruptedException e) { logger.error("Dead lock detector interrupted", e); } ThreadMXBean bean = ManagementFactory.getThreadMXBean(); logger.error("Thread deadlock bean : " + bean); long[] threadIds = bean.findDeadlockedThreads(); // Returns null if no threads are deadlocked. if (threadIds != null) { ThreadInfo[] infos = bean.getThreadInfo(threadIds); for (ThreadInfo info : infos) { StackTraceElement[] stackTraceElements = info.getStackTrace(); logger.error("Thread locked : " + info.getLockOwnerName()); for (StackTraceElement stackTraceElement : stackTraceElements) { logger.error(stackTraceElement.getClassName() + ":" + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber()); } } } } } }