线程池工厂类

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池工厂类相关的知识,希望对你有一定的参考价值。

前言: Java提供的 Executor 都在JUC (java.util.concurrent) 包下面,主要包括:线程池工厂类Executors,线程池实现类ThreadPoolExecutor等

线程池 ThreadPoolExecutor 通常都是通过 Executors 来创建的

// 返回一个可根据实际情况调整线程个数的线程池
Executors.newCachedThreadPool();

// 创建一个固定数量的线程池
Executors.newFixedThreadPool(10);

// 创建一个线程数量为1的线程池
Executors.newSingleThreadExecutor();

// 返回一个ScheduledExecutorService对象
//该对象也是调用父类的线程池方法,类似newFixedThreadPool
Executors.newScheduledThreadPool(5);

Executors.newCachedThreadPool( )
创建一个数目无上限,但是线程不会轻易销毁的线程池
初始情况下,线程池里没有线程,随着注册任务进去,就会创建一些线程来处理任务,任务完成之后,线程不会立刻销毁,而是仍然存在等待执行新的任务
若有任务则没线程时则创建线程,每个线程空闲等待时间为60秒,60秒后如果该线程没有任务可执行,则被回收;(核心线程数量为0,最大线程数量为最大,空闲等待时间为60s)

源码:

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);

Executors.newFixedThreadPool(10)
创建一个固定大小的线程池 (线程数目是固定的),不管任务再怎么多,线程数目也不会新增,任务就会在阻塞队列中排队 (工作中最主要使用的线程池)
当有任务提交时,若线程池中有空闲线程,则立即执行,若没有,则会被缓存在一个任务队列中等待有空闲的线程再去执行;(核心线程数等于最大线程数,默认空闲时间为0,空闲立马销毁)

源码:

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);

Executors.newSingleThreadExecutor( )
创建一个线程数量为1的线程池
若空闲则执行,否则入队列等待被执行;(核心线程数量为1,最大线程数量也为1,空闲等待时间为0)

源码:
该方法有2个实现,一个带自定义的线程工厂,一个不带

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));

Executors.newScheduledThreadPool(5)
和定时器的效果类似

源码:

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 
    return new ScheduledThreadPoolExecutor(corePoolSize);

以上是关于线程池工厂类的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池类ThreadPoolExecutorScheduledThreadPoolExecutor及Executors工厂类

并发编程系列之自定义可以命名的线程池工厂类

Java Executor源码解析—Executors线程池工厂以及四大内置线程池

线程池

java线程池

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现