异常信息

1
2
3
4
5
6
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.itpm.project.ThreadLocalTest@4aa8f0b4 rejected from java.util.concurrent.ThreadPoolExecutor@7960847b[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at com.itpm.project.ThreadLocalTest.extracted(ThreadLocalTest.java:34)
at com.itpm.project.ThreadLocalTest.main(ThreadLocalTest.java:23)

异常原因

1
线程任务数超出最大线程数与缓存队列数之和,并使用了AbortPolicy对象,抛出RejectedExecutionException拒绝任务的处理程序

解决方法

1
2
3
4
5
1.需执行的线程任务最好不要超过最大线程数与缓存队列数之和;超出后若ThreadPoolExecutor对象未能及时完成正在进行的线程任务或处理线程任务的速度赶不上加载线程任务的速度,ThreadPoolExecutor就会抛出该异常
2.修改handler的任务处理方式:
1.new ThreadPoolExecutor.CallerRunsPolicy(): 拒绝任务的处理程序,它直接在execute方法的调用线程中运行拒绝任务
2.new ThreadPoolExecutor.DiscardPolicy(): 拒绝任务的处理程序,静默丢弃被拒绝的任务
3.new ThreadPoolExecutor.DiscardOldestPolicy(): 拒绝任务的处理程序,丢弃最旧的未处理请求,然后重试execute