1、底层工作原理
****** 往线程池里面丢任务,线程数小于 corePoolSize的话,就会创建新的线程;如果执行完任务,没有新任务,线程会阻塞,等待新的任务到来。
2、线程池的核心配置参数
corePoolSize:核心线程数
maxImumPoolsize:最大线程数
KeepAliveTime:空闲时间,销毁线程
queue:队列
如果线程都创建完了去处理任务,队列还是满的,此时还有新的任务来,只能reject掉,有几种reject拒绝策略,可以传入RejectedExecutionHandler:
1、AbortPolicy;2、DiscardPolicy;3、DiscardOldestPolicy;4、CallerrunsPolicy
3、如果线程池队列满了之后
如果使用有界队列,可以避免内存溢出;
如果线程池无法执行更多的任务,可以自定义一个reject策略,如果线程池无法执行更多的任务了,此时建议你可以把这个任务信息持久化写入磁盘里去,后台专门启动一个线程,后续等待你的线程池的工作负载降低了,他可以慢慢的从磁盘里读取之前持久化的任务,重新提交到线程池里去执行。
4、如果线上机器突然宕机,线程池的阻塞队列中的请求怎么办
必然会使线程池里积压的任务丢失。所以,可以提交一个任务到线程池之前,先在数据里插入这个任务的信息,然后更新它的状态:未提交、已提交、已完成。提交成功后,更新状态为已提交。
重启后,后台线程去扫描数据库里面的未提交和已提交状态的任务;重新提交到线程池。