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

时间:2016-07-15 19:42:53

标签: java multithreading threadpool threadpoolexecutor

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

  

ScheduledExecutorService visiblityThreadPool =   Executors.newScheduledThreadPool(10);

现在在日志中我将thredName视为 pool-39-thread-3

我可以使用3号线,假设线程号从1到10不等,但是如果39号名中的池号怎么样?

这里有39表示什么?请加以说明。

1 个答案:

答案 0 :(得分:0)

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

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-后面的数字是根据AtomicInteger字段中存储的static生成的。每个DefaultThreadFactory实例都会得到一个“id”,表示在其之前初始化的其他实例数(+1)。

由于ExecutorService中的大多数Executors工厂方法都使用此DefaultThreadFactory,因此您还可以假设此数字表示通过ExecutorService创建了多少个线程池。