首先,java线程池的一个非常重要的类,就是ThreadPoolExecutor类
新建一个线程池,代码为
ThreadPoolExecutor executor = new ThreadPoolExecutor(...);
构造函数的参数说一下
- int corePoolSize 线程池规定线程数(不超载的情况下)
- int maximumPoolSize 线程池最大线程数 (已经超载了,最大能力)
- long keepAliveTimes 线程没事干时最长存活时间
- int TimeUnit 就是上面这个参数keepAliveTimes 的单位(年、月、天、小时、分钟、秒、毫秒、微秒)
- BlockingQueue bockingqueue 阻塞任务队列(超载情况下排队等待的任务数组)
最关键的参数就是这么几个,最基本的任务分配策略也是基于这几个参数。下面是任务分配策略
1、线程池初始默认线程数为0,当有任务来临时,创建新线程执行任务
2、当来的任务数大于线程池规定线程数(corePoolSize )时,剩下多余的任务到 阻塞任务队列(bockingqueue )中等待
3、当阻塞任务队列也满了的时候,也就是排队也没地儿排队了的时候,线程池会新建线程来执行任务
4、当线程池的线程数达到最大线程数(maximumPoolSize )时,再来任务也接不了了,会按照拒绝任务策略来处理剩下的事情。
keepAliveTimes 这个参数:当线程池中的线程数大于规定线程数(corePoolSize )时,而且又没啥任务,这个时候,多余的线程在 keepAliveTimes 时间后就会消亡,线程池线程数量小于 规定线程数(corePoolSize )
最后再说线程池的两个方法,shutdown() 和 shutdownNow()
shutdown():执行这个方法后,线程池不再接受新的任务,当执行完手里的任务(包括阻塞队列里的任务)后,线程池关闭【这个就相当于要离职了,也要处理好手里的事情】
shutdownNow():执行这个方法后,线程池不再接受新的任务,并且会尝试中断手里的任务,然后线程池关闭【这个就是要离职的时候,马上什么都不干了,拍屁股走人】
如果您觉得这篇文章帮到您,请您顺手点个赞,如果有什么错误之处,也请您一定不吝赐教,我们共同进步!