java中有哪些常见的线程池

  介绍

这篇文章将为大家详细讲解有关java中有哪些常见的线程池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

首先我们列java中出的六种线程池如下

线程池名称描述FixedThreadPool核心线程数与最大线程数相同SingleThreadExecutor一个线程的线程池CachedThreadPool核心线程为0,最大线程数为整数。MAX_VALUEScheduledThreadPool指定核心线程数的定时线程池SingleThreadScheduledExecutor单例的定时线程池ForkJoinPoolJDK 7新加入的一种线程池

在了解集中线程池时我们先来熟悉一下主要几个类的关系,ThreadPoolExecutor的类图,以及执行人的主要方法:

癹ava中有哪些常见的线程池"

癹ava中有哪些常见的线程池"

上面看到的类图,方便帮助下面的理解和查看,我们可以看到一个核心类ExecutorService,这是我们线程池都实现的基类,我们接下来说的都是它的实现类。

FixedThreadPool线程池的特点是它的核心线程数和最大线程数一样,我们可以看它的实现代码在执行人# newFixedThreadPool (int)中,如下:

公共静态ExecutorService newFixedThreadPool (int nThreads) {
  返回新ThreadPoolExecutor (nThreads nThreads,
  0 l, TimeUnit.MILLISECONDS,
  新的LinkedBlockingQueue ());
  }

我们可以看到方法内创建线程调用的实际是ThreadPoolExecutor类,这是线程池的核心执行器,传入的nThread参数作为核心线程数和最大线程数传入,队列采用了一个链表结构的有界队列。

    <李>这种线程池我们可以看作是固定线程数的线程池,它只有在开始初始化的时候线程数会从0开始创建,但是创建好后就不再销毁,而是全部作为常驻线程池,这里如果对线程池参数不理解的可以看之前文章《解释线程池各个参数的含义》。 <李>对于这种线程池他的第三个和第四个参数是没意义,它们是空闲线程存活时间,这里都是常驻不存在销毁,当线程处理不了时会加入到阻塞队列,这是一个链表结构的有界阻塞队列,最大长度是整数。李MAX_VALUE

SingleThreadExecutor线程的特点是它的核心线程数和最大线程数均为1,我们也可以将其任务是一个单例线程池,它的实现代码是执行人# newSingleThreadExcutor(),如下:

公共静态ExecutorService newSingleThreadExecutor () {
  返回新FinalizableDelegatedExecutorService
  (新ThreadPoolExecutor (1, - 1,
  0 l, TimeUnit.MILLISECONDS,
  新的LinkedBlockingQueue ()));
  }
  
  公共静态ExecutorService newSingleThreadExecutor ThreadFactory ThreadFactory () {
  返回新FinalizableDelegatedExecutorService
  (新ThreadPoolExecutor (1, - 1,
  0 l, TimeUnit.MILLISECONDS,
  新的LinkedBlockingQueue (),
  threadFactory));
  李}
    <>上述代码中我们发现它有一个重载函数,传入了一个ThreadFactory的参数,一般在我们开发中会传入我们自定义的线程创建工厂,如果不传入则会调用默认的线程工厂 <李>我们可以看到它与FixedThreadPool线程池的区别仅仅是核心线程数和最大线程数改为1了,也就是说不管任务多少,它只会有唯一的一个线程去执行 <李>如果在执行过程中发生异常等导致线程销毁,线程池也会重新创建一个线程来执行后续的任务李 <李>这种线程池非常适合所有任务都需要按被提交的顺序来执行的场景,是个单线程的串行。

cachedThreadPool线程池的特点是它的常驻核心线程数为0,正如其名字一样,它所有的县城都是临时的创建,关于它的实现在执行人# newCachedThreadPool()中,代码如下:

公共静态ExecutorService newCachedThreadPool () {
  返回新ThreadPoolExecutor (0 Integer.MAX_VALUE
  60 l, TimeUnit.SECONDS,
  新的SynchronousQueue ());
  }
  
  公共静态ExecutorService newCachedThreadPool ThreadFactory ThreadFactory () {
  返回新ThreadPoolExecutor (0 Integer.MAX_VALUE
  60 l, TimeUnit.SECONDS,
  新的SynchronousQueue (),
  threadFactory);
  李}
    <>从上述代码中我们可以看到CachedThreadPool线程池中,最大线程数为整数。MAX_VALUE,意味着他的线程数几乎可以无限增加。 <李>因为创建的线程都是临时线程,所以他们都会被销毁,这里空闲线程销毁时间是60秒,也就是说当线程在60秒内没有任务执行则销毁李

    java中有哪些常见的线程池