Executors工厂类:FixedThreadPool、SingleThreadExecutor、CachedThreadPool

1、Executors 简介

ThreadPoolExecutor 通常使用 工厂类Executors来创建,Executors可以创建3种类型的ThreadPoolExecutor:FixedThreadPool、SingleThreadExecutor、CachedThreadPool。

ThreadPoolExecutor

  • 可以灵活的自定义的创建线程池,可定制性很高
  • 想创建好一个合适的线程池比较难
  • 使用稍微麻烦一些
  • 实际中很少使用

Executors

  • 可以创建4种线程池,这四种线程池基本上已经包含了所有需求,将来根据业务特点选用就好
  • 使用非常简单
  • 实际中很常用

1.1、FixedThreadPool

创建一个线程数固定(corePoolSize==maximumPoolSize)的线程池

核心线程会一直运行

如果一个核心线程由于异常跪了,会新创建一个线程

无界队列LinkedBlockingQueue

1.2、SingleThreadExecutor

创建一个线程数固定(corePoolSize==maximumPoolSize==1)的线程池

核心线程会一直运行

无界队列LinkedBlockingQueue

所有task都是串行执行的(即同一时刻只有一个任务在执行)

1.3、CachedThreadPool

corePoolSize==0

maximumPoolSize==Integer.MAX_VALUE

队列:SynchronousQueue

创建一个线程池:当池中的线程都处于忙碌状态时,会立即新建一个线程来处理新来的任务

这种池将会在执行许多耗时短的异步任务的时候提高程序的性能

6秒钟内没有使用的线程将会被中止,并且从线程池中移除,因此几乎不必担心耗费资源

 

2、Executors工厂类 的 成员变量

没有成员变量,Executors 的功能就是 new 线程池用的

public class Executors {
    ......
    没有成员变量
}

 

3、重要内部类

3.1、DefaultThreadFactory

默认线程工厂

static class DefaultThreadFactory implements ThreadFactory {

    // 静态成员变量,记录DefaultThreadFactory目前创建的 线程池个数
    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;
    }
}

工厂接口 :里面只定义了1个方法:newThread(Runable r)

public interface ThreadFactory {

    Thread newThread(Runnable r);
}

 

4、构造方法

注意:private,Executors不能生成实例!!!

private Executors() {}

 

5、ThreadPoolExecutor 类的线程池

5.1、newFixedThreadPool 系列

大小固定的线程池(一旦初始化完成,线程池大小就不能改变了!!!)

corePoolSize==maximumPoolSize

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                            0L, TimeUnit.MILLISECONDS,
                                            new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                            0L, TimeUnit.MILLISECONDS,
                                            new LinkedBlockingQueue<Runnable>(),
                                            threadFactory);
}

5.2、newScheduledThreadPool 系列

corePoolSize==maximumPoolSize==1

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService(
                    new ThreadPoolExecutor(1, 1,
                                                0L, TimeUnit.MILLISECONDS,
                                                new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
    return new FinalizableDelegatedExecutorService
                        (new ThreadPoolExecutor(1, 1,
                                                    0L, TimeUnit.MILLISECONDS,
                                                    new LinkedBlockingQueue<Runnable>(),
                                                    threadFactory));
}

5.3、CachedThreadPool 系列

corePoolSize==0

maximumPoolSize==Integer.MAX_VALUE

队列:SynchronousQueue

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                                    60L, TimeUnit.SECONDS,
                                                    new SynchronousQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                                    60L, TimeUnit.SECONDS,
                                                    new SynchronousQueue<Runnable>(),
                                                    threadFactory);
}

 

6、ForkJoinPool 类线程池

 

 

 

7、ScheduledThreadPoolExecutor 类线程池

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 线程池工厂是一种构建线程池的工具,其通过提供线程池配置参数来构造线程池对象。通常来说,线程池工厂会提供一些静态方法,用于创建不同型的线程池,如单线程池、固定大小的线程池、可扩展的线程池等。 Java 标准库中提供了 `Executors` 作为线程池工厂。例如,你可以使用以下代码创建一个固定大小的线程池: ``` ExecutorService executor = Executors.newFixedThreadPool(5); ``` 这里的 `executor` 就是线程池对象。你也可以使用以下代码创建一个单线程的线程池: ``` ExecutorService executor = Executors.newSingleThreadExecutor(); ``` 另外,Java 还提供了一个 `ThreadPoolExecutor` 来提供更多细节的线程池定制能力。你可以使用 `ThreadPoolExecutor` 的构造函数来创建线程池,并通过指定线程池的配置参数来控制线程池的行为。 总的来说,线程池工厂是一种方便的工具,可以帮助你快速构建线程池,并且提供了多种选择,以满足不同的需求。 ### 回答2: Java线程池工厂是一个用于创建和管理线程池。它提供了一种方便的方式来创建和重用线程,从而实现线程的高效使用。 在Java中,线程池是一种管理和控制线程的机制,它可以将任务提交给线程执行,而不是每次都创建新的线程。这种方式避免了频繁地创建和销毁线程的开销,提高了系统的性能和响应速度。 Java线程池工厂通过提供一系列静态方法来创建不同型的线程池,比如FixedThreadPoolCachedThreadPool和ScheduledThreadPool等。这些方法返回一个实现了ExecutorService接口的线程池对象,通过这个对象可以管理线程池的状态和操作。 线程池工厂的创建线程池的方法通常包含一些参数,比如核心线程数、最大线程数、线程空闲时间、任务队列等,通过这些参数可以灵活地配置线程池以满足具体的业务需求。 线程池工厂还提供了一些管理线程池的方法,比如提交任务、关闭线程池、获取线程池状态等。通过这些方法可以方便地向线程池提交任务,并且在需要的时候可以优雅地关闭线程池。 总之,Java线程池工厂是一个非常重要的,它提供了一种简单且高效的方式来管理和重用线程,有助于提高系统的性能和可扩展性。 ### 回答3: Java线程池工厂是用来创建和管理线程池线程池可以有效地管理线程的创建和销毁,提高程序的效率和性能。 在Java中,可以使用ThreadPoolExecutor来创建线程池线程池工厂是为线程池的创建和配置提供便捷方法的工具。它可以根据需要返回不同型的线程池,比如固定大小的线程池、缓存线程池或定时任务线程池线程池工厂提供了一系列的静态方法,可以根据预定义的参数来创建线程池。比如,可以通过指定线程池的最小和最大线程数、线程的空闲时间等参数来创建一个固定大小的线程池。也可以通过设置线程池的最大线程数为无限大,来创建一个缓存线程池。 除了创建线程池线程池工厂还提供了一些其他的方法,用于执行任务或关闭线程池。可以通过submit()方法将任务提交给线程池执行,也可以通过shutdown()方法关闭线程池,停止所有线程的执行。 总的来说,Java线程池工厂是一个方便的工具,可以用于创建和管理线程池。通过使用线程池工厂,可以避免手动创建和管理线程的繁琐工作,提高程序的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值