什么网站上公司的评价最客观如何推广app
ThreadFactory
是 Java 中一个用于创建线程的接口,它可以自定义线程的创建过程,例如线程的名称、优先级、是否为守护线程等。它是 java.util.concurrent
包的一部分,通常与线程池(ThreadPoolExecutor
)一起使用。
线程池默认使用一个简单的 ThreadFactory
来创建线程,但开发者可以实现自己的 ThreadFactory
来满足特定需求,例如为线程设置统一的名称前缀,方便调试和监控。
ThreadFactory 接口定义
@FunctionalInterface
public interface ThreadFactory {Thread newThread(Runnable r);
}
newThread(Runnable r)
方法:
创建并返回一个新的线程,任务由参数 Runnable r
执行。
默认 ThreadFactory 实现
线程池默认使用的 ThreadFactory
是 Executors.defaultThreadFactory()
,它的实现如下:
public static ThreadFactory defaultThreadFactory() {return new DefaultThreadFactory();
}private static class DefaultThreadFactory implements ThreadFactory {// 静态变量,用于记录线程池的全局编号。AtomicInteger是线程安全的递增计数器。private static final AtomicInteger poolNumber = new AtomicInteger(1);// 当前线程组,用于管理线程的分组关系。private final ThreadGroup group;// 记录当前线程池中线程的编号。每个线程池独立编号,线程编号从1开始。private final AtomicInteger threadNumber = new AtomicInteger(1);// 每个线程池的线程名称前缀,便于调试和区分线程池。private final String namePrefix;// 构造函数:初始化线程组和线程名称前缀。DefaultThreadFactory() {// 获取当前的安全管理器。如果安全管理器存在,则获取线程组,否则获取当前线程的线程组。SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();// 设置线程名称的前缀,格式为 "pool-N-thread-",其中 N 是线程池编号。namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";}// 重写 ThreadFactory 接口的 newThread 方法,创建一个新线程。@Overridepublic Thread newThread(Runnable r) {// 创建一个新线程,将任务 r 绑定到线程中,并设置线程名称和所属线程组。Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);// 如果新线程是守护线程,将其设置为非守护线程。// 守护线程会在 JVM 中所有非守护线程终止后自动退出,因此这里确保线程池的线程不会被意外回收。if (t.isDaemon())t.setDaemon(false);// 如果线程的优先级不是正常优先级(Thread.NORM_PRIORITY),将其设置为正常优先级。// 这确保线程池中的所有线程具有一致的优先级。if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);// 返回新创建的线程。return t;}
}
默认实现的特点
-
线程命名规则:
线程名称格式为:pool-N-thread-M
,其中N
是线程池编号,M
是线程编号。
例如:pool-1-thread-1
、pool-1-thread-2
。 -
非守护线程:
创建的线程默认是非守护线程,这样线程池中的线程不会因为 JVM 退出而被销毁。 -
线程优先级:
默认设置为Thread.NORM_PRIORITY
,即标准优先级。 -
线程组:
线程被分配到当前线程的线程组中。