在Java中有没有办法记录*每个*Thread中断?

Edd*_*die 6 java debugging multithreading interrupt

我想以某种方式记录每次Thread.interrupt()调用,记录哪个线程发出调用(及其当前堆栈)以及识别哪个线程被中断的信息.

有没有办法做到这一点?在搜索信息时,我看到有人提到了实施安全管理器的可能性.这是可以在运行时完成的事情(例如,在Applet或Web Start客户端中),还是需要使用已安装的JVM来执行此操作?

或者有更好的方法吗?

Edd*_*die 10

作为一个快速的黑客,这是一个很多容易做的比我想象的要.由于这是一个快速入侵,我没有做任何事情,比如在解除引用数组之前确保堆栈跟踪足够深,等等.我在我签名的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);
      }
    });
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

当然,我永远不会把它留在生产代码中,但它足以告诉我究竟哪个线程导致了interrupt()我没想到的.也就是说,有了这个代码,我得到每次调用的堆栈转储Thread.interrupt().