我只是有点混淆了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的数量,或者可能是两倍,这取决于您的用例。