计划执行器服务中线程默认名称中的池编号的含义



我正在使用 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创建了多少个线程池。

相关内容

  • 没有找到相关文章

最新更新