[英]Thread and ThreadFactory
我只是对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
(在单例类中),并且我分配someName="fileName2"
将会发生什么?
假设您正在谈论Guava类ThreadFactoryBuilder
则setNameFormat方法记录为
nameFormat-与String.format(String,Object ...)兼容的格式String,将为其提供唯一整数(0、1等)作为单个参数。 该整数对于ThreadFactory的生成实例是唯一的,并将按顺序分配。
这意味着您必须在格式名称中包括要包含计数器的位置。 如果您尚未执行此操作,则说明您希望所有线程具有相同的名称。
我的问题是,由于在newFixedThreadPool中给了名称someName,该池中所有线程的名称都将保持不变。
我的猜测是格式设置不正确,因此所有线程的名称都相同。
如果我再次调用ExecutorService(在单例类中),并且我分配someName =“ fileName2”,将会发生什么?
新的线程池将拥有所有名为“ fileName2”的线程
显然,您不想重复创建线程池。 线程池的全部意义在于它是可重用的。
另外,您可能不希望线程池大小为30。根据您的使用情况,您更有可能希望它成为CPU数量或两倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.