螺纹和螺纹工厂



我只是有点混淆了Threads和ThreadFactory。所以我提出这个问题。我的意图是为每个正在运行的线程设置一个名称,这样我就可以很容易地在日志中跟踪哪个线程正在运行和中断。有了ThreadFactory,我看到它是可能的。

String someName="fileName"; // Inside first file 
...........................
.........................
Executors.newFixedThreadPool(30, new ThreadFactoryBuilder().setNameFormat(someName).build()); //in singleton class

当线程开始执行某些任务时,我将使用Thread.currentThread().getName()获取当前正在进行的线程名称,这将获取someName的值。我的问题是,既然我在newFixedThreadPool中给了someName这个名称,那么这个池中的所有线程都将保持相同的名称。如果我再次调用ExecutorService(这是在singleton类中)并将someName="fileName2"分配给

会发生什么

假设您谈论的是Guava类ThreadFactoryBuilder,则setNameFormat方法记录为

nameFormat-一个String.format(String,Object…)兼容的格式String,一个唯一的整数(0,1等)将作为单个参数提供给它。此整数对于ThreadFactory的已构建实例是唯一的,并且将按顺序分配。

这意味着您必须将计数器包含在格式名称中。如果您还没有这样做,那么您实际上已经声明希望所有线程都具有相同的名称。

我的问题是,既然我在newFixedThreadPool中给了someName这个名称,那么这个池中的所有线程都将保持相同的名称。

我的猜测是格式设置不正确,所以所有线程的名称都相同。

如果我再次调用ExecutorService(这是在singleton类中)并分配someName="fileName2",会发生什么

新的线程池将拥有名为"fileName2"的所有线程

显然,您不希望重复创建线程池。线程池的全部意义在于它是可重用的。

此外,您可能不希望线程池大小为30。您更有可能希望它是CPU的数量,或者可能是两倍,这取决于您的用例。

相关内容

  • 没有找到相关文章

最新更新