/** * */ package net.jxta.impl.util.threads; import java.io.StringWriter; import java.util.logging.Level; import net.jxta.logging.Logging; /** * Used to monitor a task which is currently being executed in a thread pool, * such that when it is deemed to be taking an excessive amount of time * to complete warnings will be logged with it's current stack. Useful for * detecting deadlocks or blocking behaviour in pools that expect rapid, * non-blocking execution. * * @author iain.mcginniss@onedrum.com */ class LongTaskDetector implements Runnable { private RunMetricsWrapper<?> taskToMonitor; public LongTaskDetector(RunMetricsWrapper<?> taskToMonitor) { this.taskToMonitor = taskToMonitor; } public void run() { if(Logging.SHOW_WARNING && TaskManager.LOG.isLoggable(Level.WARNING)) { StackTraceElement[] stack = taskToMonitor.getStack(); StringWriter stackTrace = new StringWriter(); for(StackTraceElement elem : stack) { stackTrace.append(elem.toString()); stackTrace.append('\n'); } TaskManager.LOG.log(Level.WARNING, "task of type [{0}] still running after {1}ms in thread {2}, current stack:\n{3}", new Object[] { taskToMonitor.getWrappedType(), taskToMonitor.getExecutionTime(), taskToMonitor.getExecutorThreadName(), stackTrace }); } } }