相关疑难解决方法(0)

命名ExecutorService的线程和线程池

假设我有一个利用Executor框架的应用程序

Executors.newSingleThreadExecutor().submit(new Runnable(){
    @Override
    public void run(){
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在调试器中运行此应用程序时,将使用以下(默认)名称创建一个线程:Thread[pool-1-thread-1].正如您所看到的,这不是非常有用,据我所知,该Executor框架没有提供一种简单的方法来命名创建的线程或线程池.

那么,如何为线程/线程池提供名称呢?例如,Thread[FooPool-FooThread].

java executorservice threadpool runnable managedthreadfactory

206
推荐指数
16
解决办法
11万
查看次数

使用ThreadPoolExecutor,如何获取线程池中运行的线程的名称?

我正在使用ThreadPoolExecutorJava来管理大量正在运行的线程.我创建了自己的简单,ThreadFactory所以我可以给线程更好的名字.

问题是,首次创建线程池时,名称在线程中设置,并且不与线程池实际运行的任务相关联.我理解这一点......我的Runnables和Callables - 尽管它们有名字 - 实际上是从ThreadPoolExecutor运行线程中提取的一个层次.

StackOverflow上还有一些关于为ThreadPoolExecutor线程池创建名称的问题.(请参阅如何为可调用线程命名?以及如何在Java中命名线程池的线程.)

我想知道的是:有没有人有一个很好的解决方案来保持线程池线程的名称与它实际运行的Runnable同步?

即如果我打电话Thread.getCurrentThread().getName(),我想它不会重返顶级线程池的名称,而是可赎回/名称Runnable的该线程当前正在运行.

由于这主要是为了调试和日志记录的目的,我试图避免一个解决方案,涉及我将新代码放入可能提交给ThreadPoolExecutor的每个Runnable中 - 我只是将一些代码放入ThreadFactory或包装ThreadPoolExecutor本身,以便在一个地方完成更改.如果不存在这样的解决方案,我可能不会打扰,因为它不是关键任务.

开始编辑为了澄清,我知道我可以把一个Thread.currentThread().setName( "my runnable name" );作为每个Runnable的run方法的第一行,但我试图避免这样做.我在这里是一个完美主义者,我意识到这一点,所以如果人们想对这个问题发表评论并告诉我,我不会被冒犯.结束编辑

我想,我的另一个问题是人们是否认为做这样的事情是个坏主意.我是否应该像这样更新线程池名称?

谢谢你的任何建议!

java multithreading threadpool

10
推荐指数
1
解决办法
1万
查看次数