线程池出现异常:java.util.concurrent.RejectedExecutionException
解决方法:
ThreadPoolExecutor executor = new ThreadPoolExecutor(200, 500, 30*1000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(100));这是我线程池的配置,在提交任务高并发的时候,线程池会创建200个线程来执行任务,把未来得及处理的任务放到队列中,我这设置队列的大小是100,当队列存放的元素超过100后线程池就会最多创建500个线程执行任务,当线程池中的500个线程还是无法处理完任务时,再往线程池中提交任务就会报拒绝异常。
控制台错误日志如下,可见线程池中有500个线程,正在工作的线程数也是500,而且队列中的任务也是100,由此可见线程池的线程和队列已经消耗殆尽,没有任何地方可以接纳提交的任务导致发生拒绝异常:
java.util.concurrent.RejectedExecutionException: Task com.thinkcc.survet.design.controller.SuperAdminController$1@2a0f7c53 rejected from java.util.concurrent.ThreadPoolExecutor@719741d4[Running, pool size = 500, active threads = 500, queued tasks = 100, completed tasks = 1]
1.可以加大队列容量或者最大线程数,这个要看你的服务器内存来定。
2.可以创建线程池时指定拒绝策略。