线程池工厂类

x33g5p2x  于2022-02-07 转载在 其他  
字(2.3k)|赞(0)|评价(0)|浏览(268)

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

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

  1. // 返回一个可根据实际情况调整线程个数的线程池
  2. Executors.newCachedThreadPool();
  3. // 创建一个固定数量的线程池
  4. Executors.newFixedThreadPool(10);
  5. // 创建一个线程数量为1的线程池
  6. Executors.newSingleThreadExecutor();
  7. // 返回一个ScheduledExecutorService对象
  8. //该对象也是调用父类的线程池方法,类似newFixedThreadPool
  9. Executors.newScheduledThreadPool(5);

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

源码:

  1. public static ExecutorService newCachedThreadPool() {
  2. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  3. 60L, TimeUnit.SECONDS,
  4. new SynchronousQueue<Runnable>());
  5. }
  6. public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
  7. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  8. 60L, TimeUnit.SECONDS,
  9. new SynchronousQueue<Runnable>(),
  10. threadFactory);
  11. }

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

源码:

  1. public static ExecutorService newFixedThreadPool(int nThreads) {
  2. return new ThreadPoolExecutor(nThreads, nThreads,
  3. 0L, TimeUnit.MILLISECONDS,
  4. new LinkedBlockingQueue<Runnable>());
  5. }
  6. public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
  7. return new ThreadPoolExecutor(nThreads, nThreads,
  8. 0L, TimeUnit.MILLISECONDS,
  9. new LinkedBlockingQueue<Runnable>(),
  10. threadFactory);
  11. }

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

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

  1. public static ExecutorService newSingleThreadExecutor() {
  2. return new FinalizableDelegatedExecutorService
  3. (new ThreadPoolExecutor(1, 1,
  4. 0L, TimeUnit.MILLISECONDS,
  5. new LinkedBlockingQueue<Runnable>()));
  6. }
  7. public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
  8. return new FinalizableDelegatedExecutorService
  9. (new ThreadPoolExecutor(1, 1,
  10. 0L, TimeUnit.MILLISECONDS,
  11. new LinkedBlockingQueue<Runnable>(),
  12. threadFactory));
  13. }

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

源码:

  1. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
  2. return new ScheduledThreadPoolExecutor(corePoolSize);
  3. }

相关文章