JDK1.5之后ExecutorService线程池抛RejectedExecutionException的原因剖析以及解决方案

文章探讨了在JDK1.5之后,使用ExecutorService线程池时可能出现的RejectedExecutionException异常。作者通过源码分析发现,当线程池关闭或达到最大容量(包括线程池和缓冲队列)时,会触发拒绝策略。AbortPolicy会抛出异常,而CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy则有不同的处理方式。建议根据需求设置RejectedExecutionHandler来处理异常情况。
摘要由CSDN通过智能技术生成

本人亲笔原创, 欢迎转载, 但是转载请注明出处http://blog.csdn.net/izard999/article/details/8552681  谢谢


我们的Android项目前些天把图片下载放到线程池去开线程做了,一般的界面是没有什么问题,但是数据量大一点的ListView有的时候就会抛RejectedExecutionException.

Google了一些资料,其实说的也还可以,就是举了些例子. 大致看了之后, 我还是决定自己追源码!

首先我调用Executors创建的线程池出来的对象是ThreadPoolExecutor,ScheduledThreadPoolExecutor,DelegatedExecutorService这三个类中的一个! 而ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类, DelegatedExecutorService是对ExecutorService进行一层包装.

今天我们这里不讨论每一种线程池是干什么的, 只讨论RejectedExecutionException的原由, 所以我只拿ThreadPoolExecutor这个作为例子说了.

当我们调用Executors.newFixedThreadPool(int nThreads )时会创建一个线程池给我. 源码这个方法的实现是:

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
那么我跟进去这个构造方法

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

public ThreadPoolExecutor(int corePoolSize,
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值