线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。
当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。
线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy。
AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
线程池默认的处理策略是AbortPolicy!
http://my.oschina.net/u/169390/blog/97415
线程中断处理:
http://m.oschina.net/blog/163153
http://www.infoq.com/cn/articles/java-threadPool
并发API总结:
http://www.open-open.com/doc/view/b1f600bdb0d54877b80a68cf4558af93
总结:如何写好一个多线程任务处理程序:
1.线程池可配置。
(1)核心线程数
(2)最大线程数
(3)工作队列
(4)饱和拒绝策略
(5)线程工厂【ThreadFactory】
(6)beforeExecute和afterExecute扩展
【JDK注释里 Doug Lea(concurrent包作者)展示了beforeExecute一个很有趣的示例.】
class PausableThreadPoolExecutor extends ThreadPoolExecutor {
private boolean isPaused;
private ReentrantLock pauseLock = new ReentrantLock();
private Condition unpaused = pauseLock.newCondition();
public PausableThreadPoolExecutor() { super(); }
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
pauseLock.lock();
try {
while (isPaused) unpaused.await();
} catch (InterruptedException ie) {
t.interrupt();
} finally {
pauseLock.unlock();
}
}
public void pause() {
pauseLock.lock();
try {
isPaused = true;
} finally {
pauseLock.unlock();
}
}
public void resume() {
pauseLock.lock();
try {
isPaused = false;
unpaused.signalAll();
} finally {
pauseLock.unlock();
}
}
}
使用这个线程池,用户可以随时调用pause中止剩余任务执行,当然也可以使用resume重新开始执行剩余任务
2.线程池可监控
(1)设计一个无界或有界队列用于存放线程池对象,然后开启一个监控线程轮询队列,然后输出监控信息到监控服务器即可。
3.线程池可定制
(1)可查阅《 Java 7 Concurrency Cookbook 》一书。
3.工作线程必须命名或者定制线程池的ThreadFactory。
4.工作线程捕获中断。
5.工作线程调用的同步块尽量简单,多用同步辅助类【Semaphore,CountDownLatch ,CyclicBarrier ,Phaser ,Exchanger 】
6.多用并发集合和原子类替换同步集合和synchronized块,多用ReentrantLock 替换synchronized避免可能出现的死锁,当然这不是好的办法。。。
【关于java锁可查阅:Java锁的种类以及辨析,http://ifeve.com/java_lock_see/】
7.任务分类:CPU密集型任务(计算型)和IO密集型任务(访问磁盘,数据库,网络等等)
8.特殊性配置:主线程可等待子线程执行完。
例如:http://blog.csdn.net/xiao__gui/article/details/9213413