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

时间:2015-06-08 19:30:53

标签: java multithreading stack-trace runnable

我仔细查看了“可能已经有你答案的SO”问题,并且惊讶地发现我没有找到......

当(例如)EDT中发生异常,或者您只是想因任何原因检查堆栈时,将堆栈找回Runnable的run()是微不足道的。但是你如何找到运行Runnable的线程(以及堆栈)?然后去寻找运行 线程的Runnable ......等等的线程(以及堆栈)......等等......

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

2 个答案:

答案 0 :(得分:3)

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

您可以做的是创建一个例外,并在创建时传递给Runnable。该异常将包含在创建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
            }
        }
    });
}

答案 1 :(得分:-1)

我3个月前问过这个问题,我花了整个夏天,除此之外,还设计了一大堆与之相关的工具......专门用于Jython异常处理。 Jythonistas会明白,你可以在Jython中做些事情,Java会大量挣扎。

除此之外,我还设法让这些工具跟踪一系列Runnables(他们的堆栈在运行新的Runnable时及时记录/冻结,以便将来列表),然后回到应用程序的启动程序线程。

我面临的另一个挑战是,所有这些工作不仅可以直接运行应用程序,还可以使用Python unittest模块进行单元测试。

我很惊讶,实际上,Jythonistas(据我所知)从未在Jython上下文中提出过unittest的问题,原因很简单,如果你需要启动一个新线程(通常在EDT)你在单位测试结束时的失败结果可能是无益的。

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