有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ScheduledExecutorService中线程默认名称中池号的java含义

我使用ScheduledExecutorService来维护一个核心大小为10的线程池

ScheduledExecutorService visiblityThreadPool = Executors.newScheduledThreadPool(10);

现在在日志中,我看到thredName为pool-39-thread-3

假设线程数可以在1到10之间变化,我对线程数3没有意见,但是为什么39中的池号会出现在名称中呢

39在这里表示什么?请放点灯


共 (1) 个答案

  1. # 1 楼答案

    该字符串是从java.util.concurrent.Executors$DefaultThreadFactory初始化的Thread对象的名称前缀

    这个source code of this class看起来像

    /**
     * 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创建的线程池的数量