我正在使用 ScheduledExecutorService 来维护核心大小为 10 的线程池
ScheduledExecutorService visiblityThreadPool = Executors.newScheduledThreadPool(10);
现在在日志中,我看到 thredName 为 pool-39-thread-3 。
假设线程编号可以从 1 到 10 变化,我对线程编号 3 没问题,但为什么名称中的池号在 39 中?
39在这里表示什么?请对它进行一些说明。
该字符串是从java.util.concurrent.Executors$DefaultThreadFactory
初始化Thread
对象的名称前缀。
此类的源代码如下所示
/**
* The default thread factory
*/
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
因此,pool-
后面的数字是从存储在static
字段中的AtomicInteger
生成的。每个DefaultThreadFactory
实例都会获得一个"id",表示在其之前初始化的其他实例数量(+1)。
由于Executors
中的大多数ExecutorService
工厂方法都使用此DefaultThreadFactory
,因此您还可以假设此数字表示通过ExecutorService
创建了多少个线程池。