newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException
Posted tk55
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException相关的知识,希望对你有一定的参考价值。
Exception in thread "main" java.util.concurrent.RejectedExecutionException:
Task java.[email protected]4e25154f rejected from java.util.concurrent.ScheduledThreadPoolExecutor at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(Unknown Source) at java.util.concurrent.Executors$DelegatedScheduledExecutorService.scheduleAtFixedRate(Unknown Source)
线程池默认的处理策略是AbortPolicy
用到的线程池
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy。
AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。 CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。 DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。 DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
目前的需求:要在一个线程里不断跑service 执行任务,执行一两秒再跑一个service 。
一般来说,当调用了线程池的shutdown()
方法以后,不要提交新任务给线程池。但这里这么弄不行,发现把shutdown()去掉。
发现并没不停生成新线程,问题基本解决。
以上是关于newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException的主要内容,如果未能解决你的问题,请参考以下文章