threadPoolExecutor的基本解析
2024-08-30 21:19:42
线程池的构造方法中常见参数简介
- corepoolsize:核心线程数,即便这里的线程处于空闲状态,也不会被回收,会一直存在线程池中
- maxmumpoolsize:线程池所能容纳的最大线程数,超过这个数的线程将被阻塞。
- keepaliveTime:非核心线程的最长空闲时间。一般这个值不会对corepoolsize有影响,但是如果将allowcorethreadtimeout设置为true,这个值就会对核心线程有影响。
- unit:设置keepaliveTime的单位,比如秒
- workqueue:线程池的任务队列,常见的队列会有三种:synchronousQueue,linkedBlockingQueue,ArrayBlockingQueue
- threadFactory:线程工厂,提供创建新线程的功能,其是一个接口里面只有一个方法,通过线程工厂可以对性和线程的一些属性就行设定。
- RejectedExecutionHandler:当线程池中的所有资源被用完了,添加新线程被拒绝时,回调用RejectedExecutionHandler中rejectedExecution方法
下面都假设任务队列没有大小限制:
- 如果线程数量<=核心线程数量,那么直接启动一个核心线程来执行任务,不会放入队列中。
- 如果线程数量>核心线程数,但<=最大线程数,并且任务队列是LinkedBlockingDeque的时候,超过核心线程数量的任务会放在任务队列中排队。
- 如果线程数量>核心线程数,但<=最大线程数,并且任务队列是SynchronousQueue的时候,线程池会创建新线程执行任务,这些任务也不会被放在任务队列中。这些线程属于非核心线程,在任务完成后,闲置时间达到了超时时间就会被清除。
- 如果线程数量>核心线程数,并且>最大线程数,当任务队列是LinkedBlockingDeque,会将超过核心线程的任务放在任务队列中排队。也就是当任务队列是LinkedBlockingDeque并且没有大小限制时,线程池的最大线程数设置是无效的,他的线程数最多不会超过核心线程数。
- 如果线程数量>核心线程数,并且>最大线程数,当任务队列是SynchronousQueue的时候,会因为线程池拒绝添加任务而抛出异常。
任务队列大小有限时
- 当LinkedBlockingDeque塞满时,新增的任务会直接创建新线程来执行,当创建的线程数量超过最大线程数量时会抛异常。
- SynchronousQueue没有数量限制。因为他根本不保持这些任务,而是直接交给线程池去执行。当任务数量超过最大线程数时会直接抛异常。
最新文章
- codevs 1772 歌词
- MySQL Index详解
- UVa 11995:I Can Guess the Data Structure!(数据结构练习)
- js传值
- zw版【转发&#183;台湾nvp系列Delphi例程】HALCON SmoothImage
- 学习了初级的Python
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
- like的性能问题
- Why Doesn’t Drag-and-Drop work when my Application is Running Elevated? – A: Mandatory Integrity Control and UIPI(转载)
- 模板-->;求逆矩阵(利用初等变换求解)
- Mutex — Windows API
- 【LeetCode练习题】Reverse Words in a String
- 用C语言写一个程序,得出当前系统的整形数字长(16位,32位,64位)等,不能使用sizeof()
- 【转】C++类-内存分布
- 解决类似umount target is busy挂载盘卸载不掉问题
- arcgis for js symbol图标的变化
- C# Note30: 网络爬虫
- eval &; sleep
- js el jstl list 循环
- ASP.NET MVC中的cshtml页面中的下拉框的使用