介绍
这篇文章将为大家详细讲解有关java中有哪些常见的线程池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
首先我们列java中出的六种线程池如下
在了解集中线程池时我们先来熟悉一下主要几个类的关系,ThreadPoolExecutor的类图,以及执行人的主要方法:
上面看到的类图,方便帮助下面的理解和查看,我们可以看到一个核心类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秒内没有任务执行则销毁李