Java 跟踪大型应用程序源代码中的线程初始化
如果应用程序在其代码的不同位置(包括从引用的JAR中)启动了许多线程(使用Java 跟踪大型应用程序源代码中的线程初始化,java,multithreading,debugging,Java,Multithreading,Debugging,如果应用程序在其代码的不同位置(包括从引用的JAR中)启动了许多线程(使用new Thread()以及ExecutorService),那么识别启动任何特定线程的源代码的最佳方法是什么(如应用程序的执行实例所示) 这很有帮助,例如,如果线程导致异常,我们需要从初始化线程的源代码开始(以便上下文清晰)。我从VisualVM获得的线程转储显示了许多正在运行/等待的线程,但在java.lang.thread.run(thread.java:722)中堆栈根似乎总是-没什么帮助。 `您是否能够在创建线程
new Thread()
以及ExecutorService
),那么识别启动任何特定线程的源代码的最佳方法是什么(如应用程序的执行实例所示)
这很有帮助,例如,如果线程导致异常
,我们需要从初始化线程的源代码开始(以便上下文清晰)。我从VisualVM获得的线程转储显示了许多正在运行/等待的线程,但在java.lang.thread.run(thread.java:722)中堆栈根似乎总是
-没什么帮助。
`您是否能够在创建线程的点插入代码?如果是这样,那么在您的主类中创建一个静态HashMap以及一个公共静态put方法。然后,每当创建线程t1时,调用Main.putThreadId(t1.getId(),“标识创建线程的方法的一些文本”),当捕获异常时,在HashMap中查找该值。您可以做的是,设置为启动的每个线程。 它有一个名为:
uncaughtException(Thread t,Throwable e)
在这里面,你可以放一个日志或者其他东西,你可以用它来识别调用这段代码的地方。当然,对于每个线程,您都必须单独指定作为原点
您可以通过Thread.setDefaultUncaughtExceptionHandler(myHandler)设置全局线程代码>。但为了让它与众不同,可能有一个线程组或其他东西
虽然如果线程是由引用的Jar启动的,所有这些都没有帮助。您可以使用前面给出的映射方法,但是您可以在创建线程的位置生成一个新的异常,而不是一些文本。将此异常作为值放入映射中。如果需要,您可以稍后获取堆栈跟踪。对于Executor
s,可以将其隐藏在创建辅助线程的ThreadFactory
中
使用Runnable
s时也会出现类似的问题。有时,您想知道Runnable
是在从run
方法开始的任何堆栈跟踪之上创建和排队的
当然,整个遗留代码和引用的jar问题是:您想要解决一个需要编码但不需要编码的问题。不容易:)给他们取唯一的名字怎么样?@Andremoniy这是个好主意!但如果这是遗留代码呢?许多线程名称都是在代码中生成的,对调试没有帮助