遇到java.util.concurrent.RejectedExecutionException

目前看来,最主要有2种原因。

第一:

你的线程池ThreadPoolExecutor 显示的shutdown()之后,再向线程池提交任务的时候。 如果你配置的拒绝策略是AbortPolicy的话,这个异常就会抛出来。

第二:

当你设置的任务缓存队列过小的时候,或者说, 你的线程池里面所有的线程都在干活(线程数== maxPoolSize),并且你的任务缓存队列也已经充满了等待的队列, 这个时候,你再向它提交任务,则会抛出这个异常。

下面用例子来说明一下,两种情况:

第一种, 显示关闭掉了线程池

这一点其实理解起来很简单, 比如说,你向一个仓库去存放货物,一开始,仓库管理员把门给你打开了,你放了第一件商品到仓库里面,但是当你放好出去的时候,不小心把仓库的门关掉了, 那么你下次再来存放的时候, 你就会被拒绝掉。

落实到代码就是:

ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(5, 10, 3000L, TimeUnit.MILLISECONDS,  new LinkedBlockingQueue<Runnable>(4));

for (int i = 0; i < 2; i++) {

EXECUTOR.execute(new Runnable() {

public void run() {

System.out.println("Hello World");

}

});

EXECUTOR.shutdown();

}

 
01 ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(5, 10, 3000L, TimeUnit.MILLISECONDS,
02                                                           new LinkedBlockingQueue<Runnable>(4));
03      for (int i = 0; i < 2; i++) {
04          EXECUTOR.execute(new Runnable() {
05              public void run() {
06                  System.out.println("Hello World");
07              }
08          });
09          EXECUTOR.shutdown();
10      }

如上, 在我们提交第一个任务之后,线程池就被关闭掉了。 那么你再向线程池提交新任务的时候,你就会遇到类似的异常。

为什么会这样?

原因是,在ThreadPoolExecutor内部,存放着当前这个线程池的运行状态。

当你调用shutdown的时候, 线程池会有顺序的将线程池中正在运行的任务给关闭掉。InterruptException这样的异常。

第二种代码如下:

for (int i = 0; i < 15; i++) {

final int tmpint=i;

EXECUTOR.execute(new Runnable() {

public void run() {

try {

System.out.println(tmpint+"Hello World");

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

});

}

 
01 for (int i = 0; i < 15; i++) {
02          final int tmpint=i;
03          EXECUTOR.execute(new Runnable() {
04              public void run() {
05                  try {
06                      System.out.println(tmpint+"Hello World");
07                      Thread.sleep(1000);
08                  } catch (InterruptedException e) {
09                  }
10              }
11          });
12      }

类似的,当你的线程池中 ,正在执行包括正在等待的线程数有 maxPool + workQueueSize 这个数量的话。 再次向它提交任务,则会遇到这个异常。

比如,上面的线程数: 如果当前线程正在跑的数量 <最大线程, 再加上等待的, 都有我们的业务点吗?

解决办法:

针对第一种,可以再往线程池存放线程之前先判断线程池是否已经关闭

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ExecutorServiceDemo {

static class MyThread implements Runnable {

public void run() {

   try {

    Thread.sleep(500);

    // System.out.println("MyThread...");

   } catch (InterruptedException e) {

    e.printStackTrace();

   }

  }

 }

public static void main(String[] args) {

ExecutorService pool = Executors.newFixedThreadPool(20);

  

  System.out.println("pool start ...");

  

  for (int i = 0; i < 1000; i++) {

   

   try {

if(!pool.isShutdown()){

     

     pool.execute(new MyThread());

    }

if (i == 300) {

     

     pool.shutdown();

    }

    

   } catch (Exception e) {

    

    e.printStackTrace();

   }

  }

  System.out.println("pool end ...");

 }

}

第二种:

可以将线程池的数量调大点(minPoolSize,maxPoolSize,handlerList)这新信息。

关于 java.util.concurrent.RejectedExecutionException的更多相关文章

  1. java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejected from java.util.concurrent.ThreadPoolExecutor@11f7cc04[Terminated, pool size = 0, active threads

    java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejec ...

  2. java.util.concurrent.RejectedExecutionException: event executor terminated解决方法之一

    INFO | jvm 1 | 2017/03/09 19:45:10 | java.util.concurrent.RejectedExecutionException: event executor ...

  3. java.util.concurrent.RejectedExecutionException

    java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@59f1ca76 rejec ...

  4. java.util.concurrent.RejectedExecutionException 线程池饱和

    java.util.concurrent.RejectedExecutionException at java.util.concurrent.ThreadPoolExecutor$AbortPoli ...

  5. newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException

    Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util ...

  6. Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:

    异常引发的问题: 线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,⽐如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需 ...

  7. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  8. java.util.concurrent.ThreadPoolExecutor

    java.util.concurrent.ThreadPoolExecutor An ExecutorService that executes each submitted task using o ...

  9. 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

    这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int ...

  10. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

随机推荐

  1. 【YashanDB知识库】手动停止统计信息自动收集任务导致的性能变差

    [问题分类]功能使用 [关键字]统计信息收集 [问题描述]UAT对外演示环境因统计信息收集任务引起数据库整理性能变慢无应急处理手段 [问题原因分析] ● DROP_JOB程序用于删除一个非执行状态下的 ...

  2. springboot-实现csv文件导出功能

    excle文件导出,会遇到一个65535行限制的问题,就是导出的数据行数超过65535行就会导出失败,这个是excle本生的限制,这种情况下通常将导出的格式改成csv这样就可以跨过这个限制,同时生成的 ...

  3. C# 中的 AEAD_AES_256_GCM

    注意:AEAD_AES_256_GCM Key的长度必须是32位,nonce的长度必须是12位,附加数据有可能为空值.AEAD_AES_128_GCM Key的长度必须是16位,nonce的长度必须是 ...

  4. LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解

    题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 作为目前遇到 ...

  5. 单片机-XIP-外部闪存就地执行代码

    声明:此博文所述我未实践,目的是知识整理. 1.  常说的 "单片机的norflash上可以执行代码 " 这句话该如何理解? CPU做取指.译码.执行. 常说的哪些介质可以执行程序 ...

  6. [TK] Tourist Attractions

    题目描述 给出一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权. 你需要找一条从 \(1\) 到 \(n\) 的最短路径,并且这条路径在满足给出的 \(g\) 个限制的情况下可以在所有 ...

  7. SuperMap iServer8C证书过期如何解决

    说明:该问题是SuperMap iServer8.0.2和8.1.0版本云许可模块问题,需要手动更新云许可HTTPS证书,可以升级到官网8.1.1/9D/10i等方式进行解决 针对无法升级或者老项目维 ...

  8. 使用BAT脚本实现文件异机备份,并且还有文件的时间戳

    事件起因: 由于我们单位是创意设计公司,在设计文件的隐私性和保密性上都是有要求的,单位里的办公机的USB口都是禁用的,防治资料泄露:服务器之间还要做实时备份,并且文件的创建时间都是要保证准确性的.但是 ...

  9. jpa 多条件模糊查询,分页并排序

    jpa 多条件模糊查询,分页并排序很难吗,这样写不就几行代码的事吗?搞不明白你们写的怎么长篇大论花里胡哨的,看的一脸懵逼. jpa多字段模糊查询,持久层字段还是要一一对应的,但是你可以在service ...

  10. java爬取航班实时数据

    使用jsoup获取航班实时数据 优先使用携程航班数据  如果携程航班数据返回为空 则使用去哪儿航班信息 pom.xml <dependency> <groupId>org.js ...