《1》线程的状态:NEW(创建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING、TERMINATED(执行完毕)
《2》常见的四种线程池:https://www.cnblogs.com/baizhanshi/p/5469948.html
《3》参数原理讲解:https://www.cnblogs.com/kuoAT/p/6714762.html
(1)corePoolSize 核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作)。
(2)maximumPoolSize 指的是线程池的最大大小(线程池中最大有corePoolSize 个线程可运行)。
(3)keepAliveTime 指的是空闲线程结束的超时时间(当一个线程不工作时,过keepAliveTime 长时间将停止该线程)。
(4)unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值)。
(5)workQueue 表示存放任务的队列(存放需要被线程池执行的线程队列)。
(6)handler 拒绝策略(添加任务失败后如何处理该任务).
《4》拒绝策略:https://blog.csdn.net/jgteng/article/details/54411423
(1)AbortPolicy:丢掉这个任务并抛出RejectedExecutionException异常
(2)DiscardPolicy:直接丢掉任务,没有任何反应
(3)DiscardOldestPolicy:丢掉老的任务,没有任何反应
(4)CallerRunsOlicy:主线程自己去执行这个任务
(5)自定义:实现RejectedExecutionHandler接口
《5》使用示例:https://www.cnblogs.com/yysbolg/p/7355800.html
《6》运行策略
(1)刚创建线程池时,里面没有线程;任务队列是作为参数传过来,即时队列里面
有任务,也不会马上执行;
(2)当调用excute()方法添加一个任务时,线程池会做如下判断:
a、如果正在运行的线程数小于corePoolSize,那么马上创建线程运行这个任务;
b、如果大于或等于corePoolSize,那么将这个任务加入队列;
c、如果对列也满了,运行线程数小于maximumPoolSize,创建线程运行这个任务;
d、对列满了,大于或等于maximumPoolSize,那么会拒绝这个任务;
(3)当一个线程执行完了,会从队列中去下一个任务来执行;
(4)当一个线程无事做,超过keepAliveTime是,线程会判断,如果当前运行数大于
corePoolSize,那么这个任务被停掉,所以线程的所有任务完成后,它最终收缩到
corePoolSize的大小;
例子:这个过程说明,并不是先加入任务就一定会先执行。假设队列大小为 4,corePoolSize为2,
maximumPoolSize为6,那么当加入15个任务时,执行的顺序类似这样:首先执行任务 1、2,
然后任务3~6被放入队列。这时候队列满了,任务7、8、9、10 会被马上执行,而任务 11~15
则会抛出异常。最终顺序是:1、2、7、8、9、10、3、4、5、6。当然这个过程是针对指定大
小的ArrayBlockingQueue<Runnable>来说,如果是LinkedBlockingQueue<Runnable>,因为该队列
无大小限制,所以不存在上述问题
java四种线程池的使用
最新推荐文章于 2024-01-28 09:00:00 发布