📜  Java中的 ThreadFactory 接口与示例(1)

📅  最后修改于: 2023-12-03 15:16:27.193000             🧑  作者: Mango

Java中的 ThreadFactory 接口与示例

什么是 ThreadFactory 接口

ThreadFactory是一个创建线程的工厂接口,其主要作用是为线程池提供线程对象的创建方式,可以用来统一管理线程的创建方式。在Java中,我们通常使用Executors类来创建线程池,而ThreadFactory可以作为Executors类的参数来创建带有指定线程创建方式的线程池。

ThreadFactory 接口定义

以下是ThreadFactory接口的定义:

public interface ThreadFactory {
    Thread newThread(Runnable r);
}

从定义可以看出,ThreadFactory接口中只有一个newThread方法,该方法用于创建一个新的线程对象。在调用线程池的execute方法时,线程池会调用ThreadFactorynewThread方法来创建新的线程对象。

ThreadFactory 接口示例

下面是一个自定义的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;
    }
}

上述示例中,我们自定义了一个叫做NamedThreadFactoryThreadFactory。该工厂创建的线程对象将以name-1name-2name-3,......的命名方式进行命名。

在创建线程对象时,我们同时为其设置了一些默认属性,如它不是守护线程,其优先级为默认优先级。

使用 ThreadFactory

创建线程池时,我们可以将自定义的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对象。最后,我们向线程池提交了一个任务来观察自定义线程名的效果。