Java中的小知识——线程池补充

2020-03-18 12:43:57 浏览数 (1)

在我的线程池博客中我已经粗略的说过了线程池。

线程池

但是我只说了一种创建线程池对象的方法

public static ExecutorService newFixedThreadPool(int nThreads);

但是我在使用中,发现这种方式并不受阿里巴巴欢迎。

因为使用Executor,都是默认的初始化参数。如果项目场景复杂的话,可能不好控制。

所以我又学习了其他方法。

创建和销毁线程是非常耗时和耗资源的

如果系统中并发了很多线程,会对系统的性能造成很大的影响。

线程池就是解决线程声明周期和资源不足的问题。

线程池是通过多个任务重复使用线程来家解决问题的。

java四种线程池

  1. newFixedThreadPool 这是我们上次说到的线程池,也是我用的,被阿里巴巴规范批了一顿。

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常或执行完毕而结束,那么线程池会补充一个新线程。

通俗:可以规定线程池的大小,小于这个数量就创建新线程。当达到这个数量,就只能有这些线程,别的任务等待运行的任务结束再使用线程。

  1. newCachedThreadPool(强烈推荐) 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

通俗:线程池的大小是根据jvm的大小而定的。当线程池的大小(核心线程池大小就是创建线程池的时候默认创建几个线程)大于正在执行的任务的数量的时候,会去自动释放那些空闲的线程,当任务增加,回去新添加线程。

ThreadPoolExecutor 及其构造方法参数

核心的参数有:

1、核心线程池大小 可以理解为系统最优的线程池数,线程池创建后会默认创建这个数的空闲线程

2、最大线程池大小

3、任务队列

处理流程:

1、当可执行的任务小于核心线程池数的时候,每加一个任务就新建一个线程

2、当可执行的任务数达到核心线程池数的时候,新任务会放到任务队列中去

3、当任务队列数量满了,并且最大线程池数大于核心线程池数,新任务就新建线程

4、当需要执行的任务总数超过任务队列加最大线程池数时(也就是任务队列和最大线程池数都满了),就交给rejectHandle去做抛弃处理,策略有①直接舍弃、②抛异常 舍弃、或者③把任务队列中最前面那个干掉,重新尝试执行任务

总结

在队列还没满的时候,一直都是多个任务重复的去使用线程。当队列满了,不大于最大线程池数,每加一个就创建一个线程。。。。。

  1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

通俗:一个线程池中只能跑一个线程,单线程串行执行任务,但一个任务完成后才能进行下一个任务。

  1. newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

通俗:支持任务调度的线程池。

我是学习了这篇文章所写

参考:https://blog.csdn.net/vigoss77/article/details/81842199

0 人点赞