如果应用程序在其代码中的不同位置(包括在引用的jar中)启动了许多线程(使用new Thread()
以及使用ExecutorService
),那么识别该应用程序的最佳方法是什么?启动任何特定线程的源代码(如应用程序的执行实例中所示)
这很有用,例如,在线程导致Exception
的情况下 - 我们需要从初始化线程的源代码开始(以便上下文清晰)。我得到的线程转储从VisualVM显示许多正在运行/等待的线程,但堆栈根似乎总是at java.lang.Thread.run(Thread.java:722)
- 不是很有帮助。
`
答案 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 问题是:您希望解决需要编码但无需编码的问题。不容易:)