【Java线程池拒绝任务策略】
创建线程池可以指定拒绝策略如下:
newThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
new ThreadPoolExecutor.DiscardOldestPolicy());
一 拒绝时机
1) 调用线程池的shutdown函数,再次向线程池提交任务的时候会被拒绝。
2) 线程池已经处于饱和状态无力再执行任务(队列满了,线程数已经达到了最大线程数),如果再次提交任务会被拒绝。
二 拒绝策略
拒绝策略有以下四种:
1)AbortPolicy 策略会直接抛出RejectedExecutionException 的 RuntimeException,程序可以采用重试或放弃。
2) DiscardPolicy策略会直接默默丢失,不给你任何提示,不建议使用,容易莫名其妙丢任务。
3) DiscardOldestPolicy 策略丢弃任务队列中等待事件最长的,即最老的任务,和上一个区别是上一个丢弃的是新提交的任务,这个丢弃的是最老的任务。丢弃后就可以腾出一个队列的空位存放任务。
4) CallerRunsPolicy策略,谁提交任务谁来执行这个任务,即将任务执行放在提交的线程里面,减缓了线程的提交速度,相当于负反馈。在提交任务线程执行任务期间,线程池又可以执行完部分任务,从而腾出空间来。