java 线程管理框架_Java线程池 Executor框架概述

线程池的意义

循环利用线程资源,避免重复创建和销毁线程

线程池的任务是异步执行的,只要提交完成就能快速返回,可以提高应用响应性

Java线程池还有一个很重要的意义:Java线程池就是JDK 5 推出的Executor框架,在此之前Java线程既是工作任务又是执行机制,而Executor框架把工作任务与执行机制分离开来:工作任务包括Runnable接口和Callable接口,而执行机制由Executor接口提供。

Executor 类继承体系

9d55e8022dd6835bffe8278f2a6d2091.png

Executor框架由三个部分组成

工作任务:Runnable/Callable 接口

工作任务就是Runnable/Callable接口的实现,可以被线程池执行

执行机制:Executor接口、ExecutorService接口、ScheduledExecutorService接口

ThreadPoolExecutor 是最核心的线程池实现,用来执行被提交的任务

ScheduledThreadPoolExecutor 是任务调度的线程池实现,可以在给定的延迟后运行命令,或者定期执行命令(它比Timer更灵活)

ForkJoinPool是一个并发执行框架

异步计算的结果:Future接口

实现Future接口的FutureTask类,代表异步计算的结果

线程池的实现原理

线程池的5个重要参数(需记牢):

workQueue:工作(任务)队列

corePoolSize、maximumPoolSize:最小最大线程数

keepAliveTime:线程存活时间

threadFactory:线程工厂

handler:拒绝策略

a9af7996429d0956f2e2edb057ac57af.png

如果运行的线程数少于corePoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)

否则,说明线程数大于corePoolSize,将任务插入BlockingQueue

如果插入任务失败(队列已满),且运行的线程数少于maximumPoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)

否则,说明线程数大于maximumPoolSize,执行拒绝策略

ThreadPoolExecutor 采取上述设计思路,是为了尽可能地避免获取全局锁,在完成预热之后(当前运行的线程数大于等于corePoolSize),则几乎所有的调用都是执行步骤2,而步骤2不需要获取全局锁

关闭线程池

可以调用shutdown()或shutdownNow()来关闭线程池,其中原理是遍历所有工作线程,然后逐个调用线程的interrupt()来进行中断。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

只要调用了这两个关闭方法中的任意一个,isShutdown()就会返回true。当所有的任务都关闭后,才表示线程池关闭成功,这时调用isTerminaed()会返回true。至于调用哪一种方法来关闭线程池,应该由线程池的任务特性决定,通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值