`
ahua186186
  • 浏览: 553408 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

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

线程池共包括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
分享到:
评论

相关推荐

    92道Java多线程与并发面试题含答案(很全)

    Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。

    Java多线程和并发知识整理

    1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段37讲、给线程池增加拒绝策略以及停止方法.mp4 │ 高并发编程第一阶段38讲、给线程池增加自动扩充线程数量,以及闲时自动回收的功能.mp4 │ 高并发编程第一阶段39讲、课程结束,内容回顾,下...

    Java 7并发编程实战手册

    如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行...

    Java几种线程池类型介绍及使用.docx

    缺乏更多功能,如定时执行、定期执行、线程中断。 2.使用Java线程池的好处: 重用存在的线程,减少对象创建、消亡的开销,提升性能。 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段37讲、给线程池增加拒绝策略以及停止方法.mp4 │ 高并发编程第一阶段38讲、给线程池增加自动扩充线程数量,以及闲时自动回收的功能.mp4 │ 高并发编程第一阶段39讲、课程结束,内容回顾,下...

    Android异步并发类库Android-lite-go.zip

    测试多个线程并发的情况:// 一次投入 4 个任务for (int i = 0; i < 4; i ) {   final int j = i;  smallExecutor.execute(new Runnable() {   @Override  public void run() {  ...

    Java并发编程实战

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    Java 并发编程实战

    6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟任务与周期任务 6.3 找...

    Java并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被中断的操作,要么全部执行成功,要么全部不执行。原子...

    龙果java并发编程完整视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    Job Plus项目是基于SpringBoot+Vue的轻量级定时任务管理系统+源代码+文档说明

    26. 多线并发:系统支持多线程触发调度运行,确保调度精确执行,不被堵塞; 27. 降级隔离:调度线程池进行隔离拆分,慢任务自动降级进入"Slow"线程池,避免耗尽调度线程,提高系统稳定性; 28. Gradle: 将会把最新...

    java并发编程

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    synchronized 关键字:用于实现线程的同步,确保多个线程之间的安全访问共享资源。 Lock 接口和 ReentrantLock 类:提供更灵活的线程同步机制。 Executor 框架和线程池:用于管理和调度线程的执行。 通过合理地创建...

    Java 并发编程原理与实战视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    龙果 java并发编程原理实战

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

Global site tag (gtag.js) - Google Analytics