SingleThreadExecutor 中出现 java.util.concurrent.RejectedExecutionException 的可能原因是什么

新手上路,请多包涵

我在单例中创建了以下执行程序:

    final private ExecutorService executor = Executors.newSingleThreadExecutor(new ThreadFactory() {
        final ThreadFactory delegate = Executors.defaultThreadFactory();
        public Thread newThread(Runnable paramAnonymousRunnable) {
            Thread localThread =      this.delegate.newThread(paramAnonymousRunnable);
            localThread.setName("MyTask-" + localThread.getName());
            localThread.setDaemon(XXX.this.daemonThread);
            return localThread;
        }
    });

并且在程序执行过程中,对单例的这个方法的调用很多。这些调用在不同的线程中完成,可能同时进行。

 private void send(final String paramString) {
  try {
      this.executor.execute(new Runnable() {
          public void run() {
              //DO some interesting stuff
          }
      });
  } catch (Exception localException) {
    this.handler.handle(localException);
  }

}

在某个时候发生了以下堆栈跟踪:

 java.util.concurrent.RejectedExecutionException
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1774)
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656)
        at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:589)
        at XXXXX.send(XXXX.java:269)

为什么 JVM 会抛出这样的异常?

singleThreadExecutorLinkedBlockingQueue<Runnable>() 支持。

并且线程池没有关闭。

JVM 是 Oracle JDK 1.6。单例是用 Spring 创建的,复制自 java.util.concurrent.Executors

    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
       return new FinalizableDelegatedExecutorService
           (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>(),
                                threadFactory));
   }

原文由 RJO 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
1 个回答

execute 会抛出 RejectedExecutionException 有两个原因

  1. 队列已满,您无法添加更多线程
  2. 线程池已关闭

由于您使用的是 LinkedBlockingQueue ,我看到这种情况发生的唯一方法是因为您关闭了池。

原文由 John Vint 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题