Thread和ThreadFactory

时间:2015-12-02 06:02:29

标签: java multithreading singleton threadpool executorservice

我对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"

会怎样

1 个答案:

答案 0 :(得分:0)

假设您正在讨论Guava类ThreadFactoryBuildersetNameFormat方法记录为

  

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

这意味着您必须在格式名称中包含您希望包含计数器的位置。如果你还没有这样做,你已经有效地声明你希望所有的主题都有相同的名称。

  

我的问题是,因为我在newFixedThreadPool中给出someName的名称,所以此池中的所有线程都会保留相同的名称。

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

  

如果我再次调用ExecutorService(这是单例类)并且我分配someName =" fileName2"

会发生什么

新的线程池将包含所有被称为" fileName2"

的线程

显然,您不想重复创建线程池。线程池的重点是它可以重用。

此外,您可能不希望线程池大小为30.根据您的使用情况,您可能希望它是CPU的数量或可能是双倍。