【主题】
线程池应用及实现原理剖析
【信息】
为什么要用线程池
线程是不是越多越好?
1、线程在java中是一个对象,操作系统的资源,创建、销毁需要时间。如果创建时间+销毁时间>执行时间不划算
2、java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是从系统内存中分配的。
3、操作系统需要频繁切换线程上下文,影响性能。
线程池原理 - 概念
- 线程池管理器
- 工作线程
- 任务接口
- 任务队列
线程池API——接口定义和实现类
接口:
- Executor
- ExecutorService
- ScheduleExcutorService
实现类:
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
线程池API-方法定义

ScheduleExecutorService

线程池API-Executors工具类
- newFixedThreadPoll(int nThreads)
- newCachedThreadPoll()
- newSingleThreadExecutor()
- newScheduledThreadPoll(int corePoolSize)
线程池原理-任务execute过程

线程数量
如何确定合适数量的线程?
- 计算型任务:cpu数量的1-2倍
- IO型任务:相比计算型任务,需多一些线程,要根据具体的IO阻塞时长进行考量决定。如tomcat中默认的最大线程数为:200。也可考量根据需要在一个最小数量和最大数量间自动增减线程数。
有个小窍门:监控CPU的情况,CPU的利用率达到80%,达到充分利用。如果太满的话,证明线程池数量可能太多了,CPU处理不过来;如果太少,就没有合理地利用到。
【思考】
线程池的线程计算方式?
【行动/反馈】
【钩子】
线程池
本文深入探讨了线程池的应用场景与实现原理,分析了为何使用线程池可以提高程序效率,避免资源浪费。文章详细解释了线程池管理器、工作线程、任务接口、任务队列等核心概念,并介绍了Java中线程池API的主要接口与实现类,如Executor、ExecutorService、ScheduledExecutorService以及ThreadPoolExecutor和ScheduledThreadPoolExecutor。此外,文中还提供了线程池最佳线程数量的计算方法,帮助读者理解如何根据任务类型(计算型或IO型)调整线程池大小,以达到最优的CPU利用率。

4万+

被折叠的 条评论
为什么被折叠?



