前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的小知识——线程池补充

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

作者头像
用户7073689
发布2020-03-18 12:43:57
2860
发布2020-03-18 12:43:57
举报
文章被收录于专栏:青柠小鱼青柠小鱼

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

线程池

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java四种线程池
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档