摘要:线程池的工作原理一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行任务的任务队列阻塞队列。使用线程池可以对线程进行统一的分配和监控。线程池的注意事项虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。
线程池的工作原理
一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行
任务的任务队列(阻塞队列) 。
一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行
任务的任务队列(阻塞队列) 。
默认情况下, 在创建了线程池后, 线程池中的线程数为 0。 当任务提交给
线程池之后的处理策略如下:
1 如果此时线程池中的数量小于 corePoolSize(核心池的大小) , 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务(也就是每来一个任务, 就要创建一个线程来执行任务) 。
2 如果此时线程池中的数量大于等于 corePoolSize, 但是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。
3 如果此时线程池中的数量大于等于 corePoolSize , 缓 冲 队 列workQueue 满, 并且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。
4 如果 此时 线程 池中 的数量 大 于 等 于 corePoolSize, 缓 冲 队列workQueue 满, 并且线程池中的数量等于 maximumPoolSize, 那么通过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 如果三者都满了, 使用handler 处理被拒绝的任务。
特别注意, 在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。 当线程池中线程数量大于 corePoolSize 时, 如果某线程空闲时间超过 keepAliveTime, 线程将被终止, 直至线程池中的线程数目不大于 corePoolSize。 这样, 线程池可以动态的调整池中的线程数。
使用线程池的好处
1.通过重复利用已创建的线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。
2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。
3.提高线程的可管理性。 使用线程池可以对线程进行统一的分配和监控。
4.如果不使用线程池, 有可能造成系统创建大量线程而导致消耗完系统内存。
线程池的注意事项
虽然线程池是构建多线程应用程序的强大机制, 但使用它并不是没有风险的。
(1) 线程池的大小。 多线程应用并非线程越多越好, 需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。 一般来说, 如果代码结构合理的话, 线程数目与 CPU数量相适合即可。 如果线程运行时可能出现阻塞现象, 可相应增加池的大小; 如有必要可采用自适应算法来动态调整线程池的大小, 以提高 CPU 的有效利用率和系统的整体性能。
(2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。
(3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。
学习交流群:669823128
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70434.html
摘要:当活动线程核心线程非核心线程达到这个数值后,后续任务将会根据来进行拒绝策略处理。线程池工作原则当线程池中线程数量小于则创建线程,并处理请求。当线程池中的数量等于最大线程数时默默丢弃不能执行的新加任务,不报任何异常。 spring-cache使用记录 spring-cache的使用记录,坑点记录以及采用的解决方案 深入分析 java 线程池的实现原理 在这篇文章中,作者有条不紊的将 ja...
摘要:每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池。线程池的线程会并发的处理连接上的请求。用线程池控制线程数量,其他线程排队等候。实现包,线程池顶级接口是但是严格意义讲并不是一个线程。此线程池支持定时以及周期性执行任务的需求。 tutorial site1tutorial site2 一个问题: 每启动一个新线程都会有相应的性能开销(涉及到OS的交互:创建线程,销毁线程...
摘要:本文只介绍中线程池的基本使用,不会过多的涉及到线程池的原理。可缓存线程的线程池创建一个可缓存线程的线程池。首先是从接口继承到的方法使用该方法即将一个任务交给线程池去执行。方法方法的作用是向线程池发送关闭的指令。 首先,我们为什么需要线程池?让我们先来了解下什么是 对象池 技术。某些对象(比如线程,数据库连接等),它们创建的代价是非常大的 —— 相比于一般对象,它们创建消耗的时间和内存都...
阅读 3678·2021-11-24 10:46
阅读 1679·2021-11-15 11:38
阅读 3719·2021-11-15 11:37
阅读 3414·2021-10-27 14:19
阅读 1919·2021-09-03 10:36
阅读 1971·2021-08-16 11:02
阅读 2981·2019-08-30 15:55
阅读 2233·2019-08-30 15:44