📅  最后修改于: 2023-12-03 15:16:27.193000             🧑  作者: Mango
ThreadFactory是一个创建线程的工厂接口,其主要作用是为线程池提供线程对象的创建方式,可以用来统一管理线程的创建方式。在Java中,我们通常使用Executors
类来创建线程池,而ThreadFactory
可以作为Executors
类的参数来创建带有指定线程创建方式的线程池。
以下是ThreadFactory
接口的定义:
public interface ThreadFactory {
Thread newThread(Runnable r);
}
从定义可以看出,ThreadFactory
接口中只有一个newThread
方法,该方法用于创建一个新的线程对象。在调用线程池的execute
方法时,线程池会调用ThreadFactory
的newThread
方法来创建新的线程对象。
下面是一个自定义的ThreadFactory
示例:
class NamedThreadFactory implements ThreadFactory {
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
public NamedThreadFactory(String name) {
namePrefix = name + "-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(r, namePrefix + threadNumber.getAndIncrement());
t.setDaemon(false); // 不是守护线程
t.setPriority(Thread.NORM_PRIORITY); // 默认优先级
return t;
}
}
上述示例中,我们自定义了一个叫做NamedThreadFactory
的ThreadFactory
。该工厂创建的线程对象将以name-1
,name-2
,name-3
,......的命名方式进行命名。
在创建线程对象时,我们同时为其设置了一些默认属性,如它不是守护线程,其优先级为默认优先级。
创建线程池时,我们可以将自定义的ThreadFactory
作为Executors.newFixedThreadPool()
方法的参数进行传入,示例如下:
public static void main(String[] args) {
ThreadFactory namedThreadFactory = new NamedThreadFactory("demo");
ExecutorService executorService = Executors.newFixedThreadPool(10, namedThreadFactory);
executorService.execute(() -> System.out.println(Thread.currentThread().getName()));
executorService.shutdown();
}
在上述示例中,我们通过Executors.newFixedThreadPool(10, namedThreadFactory)
的方式创建了一个固定大小为10的线程池,并为该线程池的创建方式设置了自定义的NamedThreadFactory
对象。最后,我们向线程池提交了一个任务来观察自定义线程名的效果。