总结--线程池拒绝策略+线程中断处理+多线程并发任务处理

线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。
当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。

线程池共包括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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值