1

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

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

4

3 回答 3

0

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

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

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

于 2013-04-08T21:11:52.310 回答
0

您可以做的是,将Thread.uncaughtExceptionhandler设置为您启动的每个线程。它有一个方法叫做:

uncaughtException(Thread t,Throwable e)

在这里面你可以放一个日志或其他东西,你以后可以用它来识别从哪里调用这个代码。但是当然,对于每个线程,您都必须单独指定为原点。

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

尽管如果线程是由引用的 Jar 启动的,那么所有这些都没有帮助。

于 2013-04-08T18:41:16.267 回答
0

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

于 2013-04-08T18:28:56.487 回答