繁体   English   中英

线程和线程工厂

[英]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类ThreadFactoryBuildersetNameFormat方法记录为

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM