Is there any way in Java to log *every* Thread interrupt?

前端 未结 5 917
清酒与你
清酒与你 2021-02-06 12:11

I would like to somehow log every time Thread.interrupt() is called, logging which Thread issued the call (and its current stack) as well as identifying information

5条回答
  •  情书的邮戳
    2021-02-06 13:01

    As a quick hack, this was a lot easier to do than I thought it would be. Since this is a quick hack, I didn't do things like ensure that the stack trace is deep enough before dereferencing the array, etc. I inserted the following in my signed Applet's constructor:

    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 method is as follows:

    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());
    }
    

    I could never, of course, leave this in production code, but it sufficed to tell me exactly which thread was causing an interrupt() that I didn't expect. That is, with this code in place, I get a stack dump for every call to Thread.interrupt().

提交回复
热议问题