java - Java 中有什么方法可以记录*每个*线程中断吗?

标签 java multithreading debugging interrupt

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

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

或者有更好的方法吗?

最佳答案

作为一个快速技巧,这比我想象的要容易很多。由于这是一个快速的 hack,我没有做一些事情,比如在取消引用数组之前确保堆栈跟踪足够深等。我在我签名的 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);
      }
    });

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() 时,我都会得到一个堆栈转储。

关于java - Java 中有什么方法可以记录*每个*线程中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/799023/

相关文章:

java - Java阻塞线程占用CPU资源多吗?

javascript - Visual Studio 2013 有没有免费的插件可以调试 Javascript 代码?

Php ftp_connect 在 AWS 服务器上不起作用

c++ - MS Visual C++ 发布版和调试版之间行为不同的可能原因

Java:线程在所有类都没有 public void run() 的情况下工作?

java - 停止、中断、挂起和恢复 Java 线程

java - Apache Camel 拆分器返回字符串

swift - 多线程环境中的 Realm

java - Android LinearLayout null 异常

java - 使用泛型查询