Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跟踪大型应用程序源代码中的线程初始化_Java_Multithreading_Debugging - Fatal编程技术网

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

Java 跟踪大型应用程序源代码中的线程初始化,java,multithreading,debugging,Java,Multithreading,Debugging,如果应用程序在其代码的不同位置(包括从引用的JAR中)启动了许多线程(使用new Thread()以及ExecutorService),那么识别启动任何特定线程的源代码的最佳方法是什么(如应用程序的执行实例所示) 这很有帮助,例如,如果线程导致异常,我们需要从初始化线程的源代码开始(以便上下文清晰)。我从VisualVM获得的线程转储显示了许多正在运行/等待的线程,但在java.lang.thread.run(thread.java:722)中堆栈根似乎总是-没什么帮助。 `您是否能够在创建线程

如果应用程序在其代码的不同位置(包括从引用的JAR中)启动了许多线程(使用
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这是个好主意!但如果这是遗留代码呢?许多线程名称都是在代码中生成的,对调试没有帮助