Java - 如何从 Runnable 之前获取堆栈跟踪?

Java - how to get the stack trace from before a Runnable?

我仔细查看了这里的 SO "questions that may already have your answer",很惊讶没有找到我要的东西...

当(例如)EDT 中发生异常时,或者您出于任何原因只想检查堆栈时,找到堆栈回到 Runnable 的 运行() 是微不足道的。但是,您将如何找到 运行 Runnable 的线程(并因此找到堆栈)?并着手寻找 运行 that thread's Runnable... 等等的线程(以及堆栈)...

我知道 Thread.getAllStackTraces()...但是如何确定这些线程中的哪一个称为 "current thread"?除了 "called" 不是正确的词...我的意思是 运行 当前线程。

当您启动新线程时,原来的线程已经开始做其他事情。在稍后的时间点获取该线程正在执行的操作的堆栈跟踪可能是无关紧要的。你想要的是在线程启动时捕获堆栈。

您可以做的是创建一个异常并在创建时传递给您的 Runnable。异常将包含直到创建可运行对象时的堆栈。

像这样:

ExecutorService executor = Executors.newSingleThreadExecutor();

public void foo() {
    final Exception starterStackTrace = new Exception();
    executor.execute(new Runnable () {

        @Override
        public void run() {
            try {
                // do stuff
            } catch (Exception e) {
                e.printStackTrace(); // Thread exception
                starterStackTrace.printStackTrace(); // How thread was started
            }
        }
    });
}

我 3 个月前问过这个问题,整个夏天我都在设计一整套与此相关的工具……专门用于 Jython 异常处理。 Jythonista 会明白,您可以在 Jython 中做一些 Java 会遇到很大困难的事情。

除其他事项外,我已经设法让这些工具跟踪一系列 Runnable(它们的堆栈 recorded/frozen 以便将来在你 运行 一个新的 Runnable 时及时列出)回到起始线程一个应用程序。

我面临的另一个挑战是让所有这些工作不仅直接使用 运行 应用程序,而且在使用 Python unittest 模块进行单元测试时也能正常工作。

事实上,我很惊讶 Jythonista(据我所知)从未在 Jython 上下文中提出单元测试问题,原因很简单,如果您需要启动一个新线程(通常是 运行 EDT 中的某些内容)你在单元测试结束时的失败结果 运行 充其量可能是无用的。

欢迎任何有兴趣查看(可能改进)我的东西的人下载它...请给我留言