您好,登录后才能下订单哦!
这篇文章主要讲解了“java线程池相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java线程池相关知识点有哪些”吧!
线程池的意义:
线程是稀缺资源,它的创建与销毁是比较重且耗资原的操作。而java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为了避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配,调优与监控。
线程池的优势:
重用存在的线程,减少线程的创建,消亡的开销,提高性能
提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行
提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池的创建方式一共有五种
FixedThreadPool和SingleThreadExecutor => 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而引起OOM异常 CachedThreadPool => 允许创建的线程数为Integer.MAX_VALUE,可能会创建大量的线程,从而引起OOM异常(内存溢出异常)
corePoolSize:核心线程数 maximumPoolSize:最大线程数 keepAliveTime:存活时间 unit:存活时间的单位 workQueue:类似于银行办理业务很忙的时候除了核心窗口 还要加一些临时窗口 3.4的接口都是对于临时窗口而言 handler:拒绝策略 所有的工作都满了的时候 这时候会产生拒绝策略 jdk自带了四种拒绝策略,也可以写自己的拒绝策略 1:抛弃队列 然后抛出异常 2:抛弃队列 不抛出异常 3:抛弃队列中的前几个任务 重复执行任务 4:调用者回退机制 让调用者自己搞
线城池执行流程:一开始只有两个核心线程在工作,这时候再来线程就放到工作队列中排队,如果工作队列也满了,就创建临时线程,如果临时线程也满足
不了的话,就执行拒绝策略。
线程池的五种状态:
Running:能接受新任务,以及处理已经添加的任务
Shutdown:不接受新任务,可以处理已经添加的任务
Stop:不接受新任务,不处理已经添加的任务,并且中断正在处理的任务
Tidying:所有的任务已经终止,ctl的任务数量为0(ctl负责记录线程池的运行状态与活动线程数)
Terminated:线程池彻底终止,则线程池转化为terminated状态
线程池都有哪几种工作队列
ArrayBlockingQueue:底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。
LinkedBlockingQueue:底层是链表,可以当做无界和有界队列来使用,所以大家不要以为它就是无界队列。
SynchronousQueue:本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。
PriorityBlockingQueue:无界队列,基于数组,数据结构为二叉堆,数组第一个也是树的根节点总是最小值。
举例 ArrayBlockingQueue 实现并发同步的原理:原理就是读操作和写操作都需要获取到 AQS 独占锁才能进行操作。如果队列为空,这个时候读操作的线程进入到读线程队列排队,等待写线程写入新的元素,然后唤醒读线程队列的第一个等待线程。如果队列已满,这个时候写操作的线程进入到写线程队列排队,等待读线程将队列元素移除腾出空间,然后唤醒写线程队列的第一个等待线程。
线程池的线程数量怎么确定
一般来说,如果是CPU密集型应用,则线程池大小设置为N+1。
一般来说,如果是IO密集型应用,则线程池大小设置为2N+1。
在IO优化中,线程等待时间所占比例越高,需要越多线程,线程CPU时间所占比例越高,需要越少线程。这样的估算公式可能更适合:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
如何实现一个带优先级的线程池
利用priority参数,继承 ThreadPoolExecutor 使用 PriorityBlockingQueue 优先级队列。
感谢各位的阅读,以上就是“java线程池相关知识点有哪些”的内容了,经过本文的学习后,相信大家对java线程池相关知识点有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。