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

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

线程池共包括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

你可能感兴趣的:(线程并发)