刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
线程池和数据库连接池有点类似的是,线程池在系统启动时创建大量空闲线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该线程对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲线程,等待执行下一个Runnable对象的run方法。
使用线程池可以有效的控制系统中并发线程的数量,当系统中包含大量的并发线程时,会导致系统性能剧烈下降,甚至导致JVM的崩溃,而线程池的最大线程参数可以控制系统中并发线程数目不超过此数目。
| 种类 | 实现 | 基于的阻塞队列 | 说明 | 类型 |
|---|---|---|---|---|
| 固定大小线程池 | FixedThreadPool | LinkedBlockingQueue | 固定线程数量,任务队列无界 | ExecutorService |
| 交付模式线程池 | CachedThreadPool | SynchronousQueue | 线程数量不限制,任务队列不存放数据 | ExecutorService |
| 并行线程池 | WorkStealingPool | FIFO_QUEUE或LIFO_QUEUE | 线程数量不限制,分割任务执行 | ExecutorService |
| 定时任务线程池 | ScheduledThreadPool | DelayedWorkQueue | 线程数量不限制,任务按时间优先级执行 | ScheduledExecutorService |
| 单例固定线程池 | SingleThreadExecutor | LinkedBlockingQueue | 线程数量1个,任务按加入顺序执行 | ExecutorService |

1.在创建了线程池之后,等待提交过来的任务请求
2.当调用execute()方法添加一个请求任务的时候,线程池会做出如下判断:
2.1 如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个程序
2.2 如果正在运行的线程数量大于或者等于corePoolSize,那么将这个任务放入队列
2.3 如果这个时候队列满了并且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻执行这个任务
2.4 如果队列满了并且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行
3. 当一个线程完成任务的时候,它会从队列中取下一个任务来执行
4. 当一个线程无事可做超过一定时间(keepAliveTime)时:线程会判断如果当前运行的线程数
大于corePoolSize,那么这个线程就会被停掉。
| 队列 | 实现 | 说明 |
|---|---|---|
| LinkedBlockingQueue | 基于链表和显示锁实现的队列 | 类似于LinkedList支持并发 |
| SynchronousQueue | 基于双栈/双队列和显示锁实现的交付队列 | 基于双栈/双队列算法 |
| DelayedWorkQueue | 基于优先级队列和显示锁实现的延迟队列 | 与优先级队列类似,由二叉堆算法实现 |
| 策略 | 说明 |
|---|---|
| AbortPolicy | 当任务添加到线程池中被拒绝时,它将抛出RejectedExecutionException 异常。 |
| CallerRunsPolicy | 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。 |
| DiscardOldestPolicy | 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。 |
| DiscardPolicy | 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。 |
本文链接:说说Java线程池
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!
