【发布时间】:2012-01-21 08:20:18
【问题描述】:
我在 Java 中使用ThreadPoolExecutor 来管理大量正在运行的线程。我创建了自己的简单ThreadFactory,以便给线程起更好的名称。
问题是线程池第一次创建时在线程中设置了名称,并且与线程池实际运行的任务无关。我理解这一点……我的 Runnables 和 Callables——尽管它们有名字——实际上是 ThreadPoolExecutor 的运行线程的一个抽象层次。
StackOverflow 上还有其他一些关于为ThreadPoolExecutor 线程池创建名称的问题。 (见How to give name to a callable Thread?和How to name the threads of a thread pool in Java。)
我想知道的是:有没有人有一个好的解决方案来保持线程池线程的名称与它实际运行的 Runnable 同步?
即如果我调用 Thread.getCurrentThread().getName() 我希望它不返回顶级线程池的名称,而是返回线程当前正在运行的 Callable/Runnable 的名称。
由于这主要用于调试和记录目的,我试图避免涉及我将新代码放入每个可能提交给 ThreadPoolExecutor 的 Runnable 的解决方案——我宁愿只是将一些代码放入 ThreadFactory或包装 ThreadPoolExecutor 本身,以便在一个地方完成更改。如果不存在这样的解决方案,我可能不会打扰,因为它不是关键任务。
开始编辑澄清一下,我知道我可以将 Thread.currentThread().setName( "my runnable name" ); 作为每个 Runnable 的 run 方法的第一行,但我试图避免这样做.我在这里是一个完美主义者,我意识到这一点,所以如果人们想评论这个问题并告诉我,我不会被冒犯。 结束编辑
我想,我的另一个问题是人们是否认为做这样的事情是个坏主意。我应该警惕这样更新线程池名称吗?
感谢您的任何建议!
【问题讨论】:
-
"保持线程池线程的名称与它实际运行的 Runnable 同步" --> Runnable / Callable 没有定义名称,所以我不太明白你的问题。您的 ThreadFactory 是否实际上给每个线程一个不同的名称?
-
对,我的每个 Runnables 和 Callables 都实现了一个命名接口,所以我确实可以访问名称。我意识到我很挑剔,因为我已经为我的所有 Runnables 实现了一个特殊功能,但希望避免添加手动设置线程名称的额外代码。
-
为清晰起见进行了编辑,将一些“线程池”更改为“线程”,将一些“线程”更改为“任务”。
标签: java multithreading threadpool