昨天上线一个功能的时候,遇到java.util.concurrent.RejectedExecutionException 这个异常,给系统造成了一定的影响, 记得之前做短信平台项目的时候,有遇到过这个异常,大致知道这个异常的简单意义: 提交的任务被拒绝。
既然又遇到了,就又仔细的了解了一下这个异常发生的大致原因, 目前看来,最主要有2种原因。
第一:
你的线程池ThreadPoolExecutor 显示的shutdown()之后,再向线程池提交任务的时候。 如果你配置的拒绝策略是AbortPolicy的话,这个异常就会抛出来。
第二:
当你设置的任务缓存队列过小的时候,或者说, 你的线程池里面所有的线程都在干活(线程数== maxPoolSize),并且你的任务缓存队列也已经充满了等待的队列, 这个时候,你再向它提交任务,则会抛出这个异常。
下面用例子来说明一下,两种情况:
第一种, 显示关闭掉了线程池
这一点其实理解起来很简单, 比如说,你向一个仓库去存放货物,一开始,仓库管理员把门给你打开了,你放了第一件商品到仓库里面,但是当你放好出去的时候,不小心把仓库的门关掉了, 那么你下次再来存放的时候, 你就会被拒绝掉。
落实到代码就是:
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()
{
|
07
|
System.out.println( "Hello
World" );
|
如上, 在我们提交第一个任务之后,线程池就被关闭掉了。 那么你再向线程池提交新任务的时候,你就会遇到类似的异常。
为什么会这样?
原因是,在ThreadPoolExecutor内部,存放着当前这个线程池的运行状态。
当你调用shutdown的时候, 线程池会有顺序的将线程池中正在运行的任务给关闭掉。InterruptException这样的异常。
第二种代码如下:
01
|
for ( int i
= 0 ;
i < 15 ;
i++) {
|
03
|
EXECUTOR.execute( new Runnable()
{
|
06
|
System.out.println(tmpint+ "Hello
World" );
|
08
|
} catch (InterruptedException
e) {
|
类似的,当你的线程池中 ,正在执行包括正在等待的线程数有 maxPool + workQueueSize 这个数量的话。 再次向它提交任务,则会遇到这个异常。
比如,上面的线程数: 如果当前线程正在跑的数量 <最大线程, 再加上等待的, 都有我们的业务点吗?
解决办法:
针对第一种,暂时还没找打解决方案。 尽量避免显示调用shutdown方法。
第二种:
可以将线程池的数量调大点(minPoolSize,maxPoolSize,handlerList)这新信息。
分享到:
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
java并发工具包 java.util.concurrent中文版-带书签版
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java.util.zip包现数据压缩与解压
java并发工具包 java.util.concurrent中文版pdf
java.util.ConcurrentModificationException 异常问题详解1
详细介绍了java.util.logging.Logger的用法和结构,对如果扩展Logger起到抛砖引玉的作用!尊重劳动成果,亲下载了要给个评价!
Exception in thread “main“ java.util.InputMismatchException
Java并发编程工具包java.util.concurrent的UML类结构图 PDF
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2)
主要介绍了java.util.concurrent.ExecutionException 问题解决方法的相关资料,需要的朋友可以参考下
java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
详细介绍java.util.Date和java.sql.Date相互转换的多种方法总结,希望对大家有帮助
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
花了一段时间辛苦整理的ppt,与大家分享,请提出您的宝贵意见。