我想每次都以某种方式记录Thread.interrupt()
被调用,记录哪个线程发出调用(及其当前堆栈)以及识别有关哪个线程被中断的信息。
有没有办法做到这一点?在搜索信息时,我看到有人提到实施安全管理器的可能性。这是可以在运行时完成的事情(例如,在 Applet 或 Web Start 客户端中),还是需要使用已安装的 JVM 工具来完成此操作?
或者有更好的方法来做到这一点吗?
作为一个快速破解,这是一个lot比我想象的更容易做到。由于这是一个快速破解,因此我没有做一些事情,例如在取消引用数组之前确保堆栈跟踪足够深等。我在签名的 Applet 的构造函数中插入了以下内容:
log.info("Old security manager = " + System.getSecurityManager());
System.setSecurityManager(new SecurityManager() {
@Override
public void checkAccess(final Thread t) {
StackTraceElement[] list = Thread.currentThread().getStackTrace();
StackTraceElement element = list[3];
if (element.getMethodName().equals("interrupt")) {
log.info("CheckAccess to interrupt(Thread = " + t.getName() + ") - "
+ element.getMethodName());
dumpThreadStack(Thread.currentThread());
}
super.checkAccess(t);
}
});
and the dumpThreadStack
方法如下:
public static void dumpThreadStack(final Thread thread) {
StringBuilder builder = new StringBuilder('\n');
try {
for (StackTraceElement element : thread.getStackTrace()) {
builder.append(element.toString()).append('\n');
}
} catch (SecurityException e) { /* ignore */ }
log.info(builder.toString());
}
当然,我永远不能将其留在生产代码中,但它足以准确地告诉我哪个线程导致了interrupt()
这是我没想到的。也就是说,有了这段代码,我每次调用都会得到一个堆栈转储Thread.interrupt()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)