我对Threads和ThreadFactory感到困惑。所以我提出这个问题。 我的目的是为每个正在运行的线程设置一个名称,这样我就可以很容易地跟踪哪个线程在log中运行和中断。使用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
(这是单身人士课程)并分配someName="fileName2"
答案 0 :(得分:0)
假设您正在讨论Guava类ThreadFactoryBuilder
,setNameFormat方法记录为
nameFormat - String.format(String,Object ...) - 兼容格式字符串,将作为单个参数提供唯一的整数(0,1等)。这个整数对于ThreadFactory的构建实例是唯一的,并且将按顺序分配。
这意味着您必须在格式名称中包含您希望包含计数器的位置。如果你还没有这样做,你已经有效地声明你希望所有的主题都有相同的名称。
我的问题是,因为我在newFixedThreadPool中给出someName的名称,所以此池中的所有线程都会保留相同的名称。
我的猜测是格式设置不正确所以你的所有线程都有相同的名称。
如果我再次调用ExecutorService(这是单例类)并且我分配someName =" fileName2"
会发生什么
新的线程池将包含所有被称为" fileName2"
的线程显然,您不想重复创建线程池。线程池的重点是它可以重用。
此外,您可能不希望线程池大小为30.根据您的使用情况,您可能希望它是CPU的数量或可能是双倍。