跟踪大型应用程序源中的线程初始化

时间:2013-04-08 18:03:01

标签: java multithreading debugging

如果应用程序在其代码中的不同位置(包括在引用的jar中)启动了许多线程(使用new Thread()以及使用ExecutorService),那么识别该应用程序的最佳方法是什么?启动任何特定线程的源代码(如应用程序的执行实例中所示)

这很有用,例如,在线程导致Exception的情况下 - 我们需要从初始化线程的源代码开始(以便上下文清晰)。我得到的线程转储从VisualVM显示许多正在运行/等待的线程,但堆栈根似乎总是at java.lang.Thread.run(Thread.java:722) - 不是很有帮助。 `

3 个答案:

答案 0 :(得分:0)

您是否能够在创建线程的位置插入代码?如果是这样,那么在主类中创建一个静态HashMap以及一个公共静态put方法。然后每当你创建一个线程t1时,调用Main.putThreadId(t1.getId(),"一些标识创建线程的方法的文本"),当你捕获异常时查找HashMap中的值。

答案 1 :(得分:0)

您可以做的是,将Thread.uncaughtExceptionhandler设置为您启动的每个主题。 它有一个名为:

的方法
uncaughtException(Thread t,Throwable e)

在此内容中,您可以放置​​日志或其他内容,以便稍后识别此代码的调用位置。但是当然,对于每个线程,您都必须单独指定为原点。

您可以按Thread.setDefaultUncaughtExceptionHandler(myHandler);设置全局值。但要使它与众不同,可能有一个ThreadGroup或其他东西。

虽然如果线程是由引用的Jar启动的话,所有这些都没有帮助。

答案 2 :(得分:0)

您可以使用之前给出的地图方法,但不是在某些文本中,您在创建线程时生成新的Exception。将此异常作为值放在地图中。如果需要,您可以稍后获取堆栈跟踪。对于Executor,您可以在创建工作线程的ThreadFactory中隐藏它。

使用Runnable时,此问题以类似的方式发生。有时您想知道Runnable已创建并排队的位置,在run方法开始的任何堆栈跟踪之上。

当然,整个遗留代码引用的jar 问题是:您希望解决需要编码但无需编码的问题。不容易:)