一步一步分析RejectedExecutionException异常

Java并发编程系列30:抛出异常 java.util.concurrent.RejectedExecutionException 1、背景介绍 Java使用线程池newFixedThreadPool针对算法进行并发测试时,出现以下错误java.util.concurrent.RejectedExecutionException Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.cipherxxxcrypto.pertest.SM4PerTest$DecTask@76ed5528 rejected from ja 阅读详情

问题的产生

最近在开发批量发送动态push功能的时候,用了线程池提高批量发送的效率,并在线程池任务全部执行完毕后,更新MySQL数据库里接收人的状态信息为已接收状态。主要的业务代码如下:

	   // 查询今天接收动态push用户的数据
		String createTime = DateUtils.formatDate(new Date(), DateUtils.DAY_FROMAT);
		List<MomentsPush> momentsPushs = this.momentsPushDao.getMomentsPushListByCreateTime(createTime);
		// 使用线程池发送push,MOMENTS_EXECUTORS是一个public static final的全局静态的固定线程池
		for (MomentsPush momentsPush : momentsPushs) {
			MOMENTS_EXECUTORS.execute(new Runnable() {
				//发送逻辑
			}
		}
		// 发出关闭线程池信号,等待任务完成后更新接收人状态
	   exec.shutdown();
	   while(true){ 
	       if(exec.isTerminated()){  
	            //更新接收人状态逻辑
	            break;  
	       }  
	       Thread.sleep(1000);    
	    }

代码写好后,我部署到了内网测试,第一次批量发送正常,但是在执行第二次批量发送的时候,遇到了以下异常信息:

java.util.concurrent.RejectedExecutionException: Task com.baihe.push.service.impl.MomentsPushServiceImpl$2@6f55c921 
rejected from java.util.concurrent.ThreadPoolExecutor@6307ca2e[Terminated, pool size = 0, active threads = 0, queued
 tasks = 0, completed tasks = 111401]

Google了之后,发现是我调用了exec.shutdown()方法之后又提交新任务给线程池导致的。最后我改变了代码逻辑,没有调用exec.shutdown()和exec.isTerminated()方法来关闭和判断线程池的状态。接下来将这个问题的解决方式总结一下。

入门示例

下面的测试程序使用ThreadPoolExecutor类来创建线程池执行任务,代表任务Worker类代码如下:

package com.concurrent.rejectedexecutionexception;

public class Worker implements Runnable {

	private int ID;

	public Worker(int id) {
		// TODO Auto-generated constructor stub
		this.ID = id;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread curThread = Thread.currentThread();
			System.out.println(curThread.getName() + " 执行任务 " + ID);
			Thread.sleep(500);
			System.out.println(curThread.getName() + " 完成任务 " + ID);
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	public int getID() {
		return ID;
	}

	public void setID(int iD) {
		ID = iD;
	}
}

执行Worker任务的代码如下:

package com.concurrent.rejectedexecutionexception;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class RejectedExecutionExceptionExample {

	public static void main(String[] args) {

		ExecutorService executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(15));

		Worker tasks[] = new Worker[10];
		for (int i = 0; i < 10; i++) {
			tasks[i] = new Worker(i);
			executor.execute(tasks[i]);
		}
		executor.shutdown();
	}
}

运行一下,看到如下输出:

pool-1-thread-1 执行任务 0
pool-1-thread-2 执行任务 1
pool-1-thread-3 执行任务 2
pool-1-thread-1 完成任务 0
pool-1-thread-1 执行任务 3
pool-1-thread-3 完成任务 2
pool-1-thread-2 完成任务 1
pool-1-thread-3 执行任务 4
pool-1-thread-2 执行任务 5
pool-1-thread-1 完成任务 3
pool-1-thread-1 执行任务 6
pool-1-thread-2 完成任务 5
pool-1-thread-2 执行任务 7
pool-1-thread-3 完成任务 4
pool-1-thread-3 执行任务 8
pool-1-thread-1 完成任务 6
pool-1-thread-1 执行任务 9
pool-1-thread-3 完成任务 8
pool-1-thread-2 完成任务 7
pool-1-thread-1 完成任务 9

在RejectedExecutionExceptionExample类里,我们使用ThreadPoolExecutor类创建了一个数量为3的线程池来执行任务,在这3个线程执行任务被占用期间,如果有新任务提交给线程池,那么这些新任务会被保存在BlockingQueue阻塞队列里,以等待被空闲线程取出并执行。在这里我们使用一个大小为15的ArrayBlockingQueue队列来保存待执行的任务(原因接下来会说明),然后我们创建了10个任务提交给ThreadPoolExecutor线程池。

异常场景1

产生RejectedExecutionException异常的第一个原因:

调用shutdown()方法关闭了ThreadPoolExecutor线程池,又提交新任务给ThreadPoolExecutor线程池执行。一般调用shutdown()方法之后,JVM会得到一个关闭线程池的信号,并不会立即关闭线程池,原来线程池里未执行完的任务仍然在执行,等到任务都执行完后才关闭线程池,但是JVM不允许再提交新任务给线程池。

让我们用以下例子来重现该异常:

package com.concurrent.rejectedexecutionexception;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class RejectedExecutionExceptionExample {

	public static void main(String[] args) {

		ExecutorService executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(15));

		Worker tasks[] = new Worker[10];
		for (int i = 0; i < 10; i++) {
			tasks[i] = new Worker(i);
			executor.execute(tasks[i]);
		}
		executor.shutdown();// 关闭线程池
		executor.execute(tasks[0]);// 关闭线程池之后提交新任务,运行之后抛异常
	}
}

运行一下,看到如下输出:

pool-1-thread-1 执行任务 0
pool-1-thread-3 执行任务 2
pool-1-thread-2 执行任务 1
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.concurrent.rejectedexecutionexception.Worker@55f96302 rejected from java.util.concurrent.ThreadPoolExecutor@3d4eac69[Shutting down, pool size = 3, active threads = 3, queued tasks = 7, 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.concurrent.rejectedexecutionexception.RejectedExecutionExceptionExample.main(RejectedExecutionExceptionExample.java:20)
pool-1-thread-1 完成任务 0
pool-1-thread-2 完成任务 1
pool-1-thread-3 完成任务 2
pool-1-thread-1 执行任务 4
pool-1-thread-2 执行任务 3
pool-1-thread-3 执行任务 5
pool-1-thread-3 完成任务 5
pool-1-thread-2 完成任务 3
pool-1-thread-1 完成任务 4
pool-1-thread-2 执行任务 7
pool-1-thread-3 执行任务 6
pool-1-thread-1 执行任务 8
pool-1-thread-2 完成任务 7
pool-1-thread-2 执行任务 9
pool-1-thread-1 完成任务 8
pool-1-thread-3 完成任务 6
pool-1-thread-2 完成任务 9

从以上例子可以看出,在调用shutdown()方法之后,由于JVM不允许再提交新任务给线程池,于是抛出了RejectedExecutionException异常。

异常场景2

产生RejectedExecutionException异常第二个原因:

要提交给阻塞队列的任务超出了该队列的最大容量。当线程池里的线程都繁忙的时候,新任务会被提交给阻塞队列保存,这个阻塞队列一旦饱和,线程池就会拒绝接收新任务,随即抛出异常。

示例代码如下:

package com.concurrent.rejectedexecutionexception;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class RejectedExecutionExceptionExample {

	public static void main(String[] args) {
		
		// 用一个大小为15的ArrayBlockingQueue保存待执行的任务
		ExecutorService executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(15));

		// 提交给线程池20个任务
		Worker tasks[] = new Worker[20];
		for (int i = 0; i < 20; i++) {
			tasks[i] = new Worker(i);
			executor.execute(tasks[i]);
		}
		executor.shutdown();// 关闭线程池
		executor.execute(tasks[0]);// 关闭线程池之后提交新任务,运行之后抛异常
	}
}

在上面的例子中,我们使用了一个大小为15的ArrayBlockingQueue阻塞队列来保存等待执行的任务。接着我们提交了20个任务给线程池,由于每个线程执行任务的时候会睡眠0.5秒,因此当3个线程繁忙的时候,其他任务不会立即得到执行,我们提交的新任务会被保存在队列里。当等待任务的数量超过线程池阻塞队列的最大容量时,抛出了RejectedExecutionException异常。

如何解决

要解决RejectedExecutionException异常,首先我们要注意两种情况:

  • 当调用了线程池的shutdown()方法以后,不要提交新任务给线程池

  • 不要提交大量超过线程池处理能力的任务,这时可能会导致队列饱和,抛出异常

对于第二种情况,我们很容易解决。我们可以选择一种不需要设置大小限制的数据结构,比如LinkedBlockingQueue阻塞队列。因此在使用LinkedBlockingQueue队列以后,如果还出现RejectedExecutionException异常,就要将问题的重点放在第一种情况上。如果第一种情况不是产生问题的原因,那么我们还需要寻找更复杂的原因。比如,由于线程死锁和LinkedBlockingQueue饱和,导致内存占用过大,这个时候我们就需要考虑JVM可用内存的问题了。

对于第二种情况,通常有一些隐藏的信息被我们忽略。其实我们可以给使用ArrayBlockingQueue作为阻塞队列的ThreadPoolExecutor线程池提交超过15个的任务,只要我们在提交新任务前设置一个完成原来任务的等待时间,这时3个线程就会逐渐消费ArrayBlockingQueue阻塞队列里的任务,而不会使它堵塞。示例如下:

package com.concurrent.rejectedexecutionexception;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class RejectedExecutionExceptionExample {

	public static void main(String[] args) throws InterruptedException {

		// 用一个大小为15的ArrayBlockingQueue保存待执行的任务
		ExecutorService executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(15));

		// 提交给线程池20个任务
		Worker tasks[] = new Worker[20];
		for (int i = 0; i < 10; i++) {
			tasks[i] = new Worker(i);
			executor.execute(tasks[i]);
		}
		Thread.sleep(3000);// 让主线程睡眠三秒
		for (int i = 10; i < 20; i++) {
			tasks[i] = new Worker(i);
			executor.execute(tasks[i]);
		}
		executor.shutdown();// 关闭线程池
	}
}

运行一下,看到如下输出:

pool-1-thread-1 执行任务 0
pool-1-thread-3 执行任务 2
pool-1-thread-2 执行任务 1
pool-1-thread-1 完成任务 0
pool-1-thread-3 完成任务 2
pool-1-thread-2 完成任务 1
pool-1-thread-1 执行任务 3
pool-1-thread-3 执行任务 4
pool-1-thread-2 执行任务 5
pool-1-thread-3 完成任务 4
pool-1-thread-3 执行任务 6
pool-1-thread-2 完成任务 5
pool-1-thread-2 执行任务 7
pool-1-thread-1 完成任务 3
pool-1-thread-1 执行任务 8
pool-1-thread-2 完成任务 7
pool-1-thread-2 执行任务 9
pool-1-thread-1 完成任务 8
pool-1-thread-3 完成任务 6
pool-1-thread-2 完成任务 9
pool-1-thread-1 执行任务 10
pool-1-thread-2 执行任务 12
pool-1-thread-3 执行任务 11
pool-1-thread-2 完成任务 12
pool-1-thread-2 执行任务 13
pool-1-thread-3 完成任务 11
pool-1-thread-3 执行任务 14
pool-1-thread-1 完成任务 10
pool-1-thread-1 执行任务 15
pool-1-thread-2 完成任务 13
pool-1-thread-1 完成任务 15
pool-1-thread-1 执行任务 17
pool-1-thread-3 完成任务 14
pool-1-thread-3 执行任务 18
pool-1-thread-2 执行任务 16
pool-1-thread-1 完成任务 17
pool-1-thread-2 完成任务 16
pool-1-thread-3 完成任务 18
pool-1-thread-1 执行任务 19
pool-1-thread-1 完成任务 19

当然上面这种设置等待时间来分隔旧任务和新任务的方式,在高并发情况下效率并不高,一方面由于我们无法准确预估等待时间,一方面由于ArrayBlockingQueue内部只使用了一个锁来隔离读和写的操作,因此效率没有使用了两个锁来隔离读写操作的LinkedBlockingQueue高,故而不推荐使用这种方式。

参考链接:java.util.concurrent.RejectedExecutionException – How to solve RejectedExecutionException

java.util.concurrent.RejectedExecutionException异常 场景 业务一切正常,突然收到一堆告警,发现全是 java.util.concurrent.RejectedExecutionException异常报错。 具体看了下代码,里面的执行逻辑也不难,没有外部依赖都是内存多线程cpu类型计算的逻辑。 下面是报错的线程池状态变化,由上到下,按照时间增长,最后达到饱和。 java.util.concurrent.ThreadPoolExecutor@57b5ea0f[Running, pool size = 99, active threads = 75, queued 阅读详情

相关推荐

正确解决java.util.concurrent.RejectedExecutionException异常的有效解决方法

正确解决java.util.concurrent.RejectedExecutionException异常的有效解决方法

wbajsjhhhhh的博客 2900

RejectedExecutionException

ThreadPoolExecutor 一个ExecutorService,它使用可能的几个线程池之一执行每个提交的任务,通常使用Executors工厂方法配置,但是查看源码,发现工厂方法也是统一调用了ThreadPoolExecutor类,以为例,源码如下: public class Executors { public static ExecutorService newFi

答案是肯定的 2万+

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 470

多线程报错RejectedExecutionException java.util.concurrent.RejectedExecutionException

异常名称:Rejected Execution Exception (拒绝执行异常) 出现此异常大都是因为线程池已经被销毁,但是后续又再次调用了已经销毁的线程池导致的。 下面是针对我的源码分析问题原因:

北鹤M的代码手账 6511

【操作系统】 Operation System 第二章:操作系统基础操作

2.1 操作系统的启动 (1)CPU, I/O, 内存通过总线连接。 (2)DISK:存放OS; BIOS:基本I/O处理系统( basic I/O system); Bootloader: 加载OS到内存中。 (3)当电脑通电时,段寄存器CS和指令寄存器IP能够确定一个内存地址,例如CS:IP = 0xf000:fff0. (4)POST(加电自检),寻找显卡和执行BIOS。(显示器,键盘…是否...

iwanderu的博客 1万+

SPMI、PMBus、AVSBus:三大电源管理总线对比与选型指南

在现代电子系统中,电源管理是确保高性能与低功耗平衡的核心技术。其原理在于通过数字通信协议,实现电源管理单元(PMIC)与用电芯片间的精准“对话”,从而动态调整供电。这项技术的核心价值在于提升系统能效、增强可靠性并简化设计。其应用场景广泛,从智能手机、服务器到汽车电子无处不在。具体实现上,衍生出了三大主流协议:为移动嵌入式高度集成的SPMI总线、专注于工业标准监控的PMBus总线,以及追求极致实时能效的AVSBus总线。理解SPMI在复杂时序控制与PMBus在标准化配置方面的异同,是进行电源架构选型与调试的关

ithome 447

【Java】已解决java.util.concurrent.RejectedExecutionException异常

java.util.concurrent.RejectedExecutionException是Java并发编程中常见的一个异常,它通常发生在使用ExecutorService(如ThreadPoolExecutor)执行异步任务时,当任务提交到线程池但线程池无法处理新任务(比如,因为已经关闭了或者达到了其最大容量)时,就会抛出此异常。在这个例子中,我们使用了ThreadPoolExecutor的构造函数来创建一个线程池,并指定了一个CallerRunsPolicy的拒绝策略。

屿小夏.的知识博客 2323

手把手教你用LIO-SAM搞定激光雷达和IMU联合标定(附避坑指南)

本文详细介绍了使用LIO-SAM进行激光雷达与IMU联合标定的全流程,包括标定原理、工具选型、硬件配置、数据采集、LI_calib标定步骤及LIO-SAM集成验证。特别提供了避坑指南和参数优化技巧,帮助开发者高效完成传感器标定,提升自动驾驶和机器人定位精度。

hadoop5ranger的博客 995

Java 线程池抛 RejectedExecutionException 异常时 active threads 值分析

背景介绍 系统日志有 RejectedExecutionException 异常,抛异常的线程池是业务程序为了某类处理过程比较慢的请求创建的,线程资源隔离,避免阻塞这个系统。异常信息类似下面输出: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@56235b8e rejected from java.util.concurrent.ThreadPoolExecutor@49c2faa

回归心灵的专栏 2万+

MobaXterm详细使用教程

当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…

博客 4万+

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

RejectedExecutionException 拒绝策略异常类解析

package test.java.util.concurrent; import java.util.concurrent.RejectedExecutionException; import org.junit.Test; /** * RejectedExecutionException的测试类 * * @date 2020-07-27 21:57:08 */ public class RejectedExecutionExceptionTest { /** .

小白爱学习的专栏 2276

STM32CubeMX之emWin移植

“前面两章介绍了SDRAM和LTDC的使用,本篇文章将介绍emWin移植到STM32。”硬件环境:STM32F429IGT6软件环境:STM32CubeMX v5.5.0...

zhang062061的专栏 2826

AsyncTask报RejectedExecutionException异常原因分析以及解决方案。

AsyncTask的线程池的排队队列的容量是128。一个AsyncTask执行队列中的任务满了,会报RejectedExecutionException异常,如下代码。 for (int i = 0; i &lt;= 10000; i++) { final int finalI = i; ...

challenge51all的专栏 2061

代谢组数据分析(一):生成代谢组数据SummarizedExperiment对象

本文介绍了基于Zeybel 2022年发布的多组学数据集的分析脚本,该数据集包含微生物组、宿主人体学指标、临床学指标、血浆代谢组和免疫因子等多维度数据,涵盖56位患者的横截面数据和22位患者的纵向时间序列数据。脚本旨在生成适用于下游分析的数据对象,主要包括phyloseq和SummarizedExperiment两类。phyloseq对象用于整合微生物群落数据,支持多数据整合、可视化、丰富分析功能和便捷的数据处理;SummarizedExperiment对象则广泛应用于基因组学和转录组学研究,便于数据整合、

专注生信领域 2988

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

通过了解RejectedExecutionException来分析ThreadPoolExecutor源码

观看本文章之前,最好看一下这篇文章熟悉下ThreadPoolExecutor基础知识。

m0_59598029的博客 2066

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringCloud 服务调用出现线程池拒绝执行异常[RejectedExecutionException]

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

zhu124866的专栏 1803

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java并发(五)线程池使用番外-分析RejectedExecutionException异常

目录   一、入门示例   二、异常场景1   三、异常场景2   四、解决方法 之前在使用线程池的时候,出现了java.util.concurrent.RejectedExecutionException,原因是线程池配置不合理,导致提交的任务来不及处理。接下来用一个简单的例子来复现异常。 Exception in thread "main" java.uti...

dlx29376的博客 998

线程池RejectedExecutionException异常

java.util.concurrent.RejectedExecutionException:

llg___的博客 864

AsyncTask线程池异常RejectedExecutionException的解决

1,问题描述: 开发的一项地图应用中,要加载很多层的数据并展示出来,一般地图都是瓦片的,那么不断的滑动,随着地图的可见瓦片不同,需要将这些层的数据不断的加载并显示出来。此时我们使用了异步加载AsyncTask,但滑动了几次或十几次时,会出现“程序异常终止”,此时观察后台日志,则报RejectedExecutionException。 我们使用两层异步任务来实现的,核心...

a521101的博客 597

java 的 ExecutorService类线程池 RejectedExecutionException异常

从java5开始,java官方推荐我们使用并发包下的Executors来处理多线程; Executors下面一共给我们提供了4种类型的线程池: 1:固定长度的线程池 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThread...

马以的专栏 1954

77 关于 java.util.concurrent.RejectedExecutionException:Thread limit exceeded replacing blocked worker

前言 呵呵 之前项目中会存在这样的一个情况 选择多个文件导入 : 假设选择多个文件(一般是十个以上), 偶尔会抛出如下异常, 呵呵 和 redis 相关, 但是看异常信息RejectedExecutionException 抛出的地方 又是在forkjoin 库里面 呵呵 这两者有什么关联呢? 这里就来看看, 呵呵 forkjoin 这部分的类库 有一些博大精深, 多久还得仔细看看, 说实话 看起来 还是很有难度 我这里 只是从解决问题的角度, 看了一些, 但是 但是还有很多不明白的地方...

970655147的专栏 9036

关于AsyncTask的RejectedExecutionException异常

当运行的AsyncTask 实例数量过多的时候会引发RejectedExecutionException异常。 经过测试在我的HTC G10或者谷歌的nexus上跑150个异步任务都会异常 [code="java"] for (int i = 0; i < 150; i++) { task = new Task(); task.execute(); } [/code] 所以...

Deans 544
上一篇: git回滚到任意版本
下一篇: Linux 常用ping命令详解
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值