`
ray_yui
  • 浏览: 216634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发编程 — 详解线程池

    博客分类:
  • Java
阅读更多

本文章需要对JDK5 Executor框架有所了解,请读者先阅读
初解线程池:http://ray-yui.iteye.com/blog/2072463


并发编程系列文章:
      初解线程池:http://ray-yui.iteye.com/blog/2072463
      详解线程池:http://ray-yui.iteye.com/blog/2075311
      并发数据类型:http://ray-yui.iteye.com/blog/2080454
      并发数据结构:http://ray-yui.iteye.com/blog/2084202
      volatile:http://ray-yui.iteye.com/blog/2231474
      判断线程安全:http://ray-yui.iteye.com/blog/2232931
      实现线程安全:http://ray-yui.iteye.com/blog/2234688


      本文将讲述如何通过JDK提供的API自定义定制的线程池

    //固定线程数 -- FixedThreadPool
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
    }

    //单条线程  --  SingleThreadExecutor
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));
    }

    //线程数自增长    --  CachedThreadPool
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
    }


      从上面代码可以看出,通过Executors创建的三种线程池其实内部都是调用
ThreadPoolExecutor进行创建


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


corePoolSize指定线程池中线程的数量
maximumPoolSize指定线程池中最大线程数量
keepAliveTime空闲线程存活时间,指超过corePoolSize的线程
unitkeepAliveTime的时间单位
workQueue任务队列,被提交但未被执行的任务存放容器
threadFactory线程创建工厂,请参考上一章
handler拒绝策略,当任务太多来不及处理时的拒绝策略



      需要重点注意的是workQueue和handler两个参数


workQueue:
      参数workQueue是指被提交但未被执行的任务所存放的队列容器,它是一个BlockingQueue接口,仅用于存放Runaable对象.根据队列功能的分类,在ThreadPoolExecutor中可以使用两种队列

直接提交队列:
      SynchronousQueue,SynchronousQueue是没有容量的容器,每一个插入的操作都需要等待相应的删除操作,SynchronousQueue不保存任务,它总是马上将任务提交给线程执行,如果没有空闲的线程则会尝试创建新的线程,如果线程数量已经达到最大值,则执行拒绝策略,使用SynchronousQueue通常需要设置很大的maximumPoolSize


有界的任务队列:
      有界队列可以使用ArrayBlockingQueue,ArrayBlockingQueue的构造函数必须传入一个容量参数,表示队列的最大容量,当使用有界队列并有新任务时,若然线程池线程数量小于corePoolSize则会创建现场,若然大于corePoolSize则会将新任务加入任务队列,当任务队列已满无法加入时,则在总线程数不大于maximumPoolSize的前提下创建线程,若大于maximumPoolSize则执行拒绝策略,使用有界队列除非系统非常繁忙,否则确保核心线程数在corePoolSize


无界的任务队列:
      无界任务队列可以使用LinkedBlockingQueue,与有界队列相比,除非系统资源耗尽,否则不会存在任务入队失败的情况.若任务创建和处理速度差异很大,无界队列会快速膨胀导致系统资源耗尽


优先任务队列:
      优先任务队列使用PriorityBlockingQueue实现,PriorityBlockingQueue是一个特殊的无界队列,创建PriorityBlockingQueue时可以传入Comparator对任务进行优先级处理,PriorityBlockingQueue和无界队列可能会发生的问题一样,不过PriorityBlockingQueue能控制任务的优先级别


handler
      handler参数指定了拒绝策略,即当任务数量超过线程池实际负载的时候,该如何处理被提交的任务,JDK内置提供了4种拒绝策略

AbortPolicy策略:
      该策略会直接抛出异常

CallerRunsPolicy策略:
      只要线程池未关闭,该策略直接在调用者线程中运行当前被放弃任务

DiscardOledestPolicy策略:
      该策略丢弃最老的一个请求,即即将被执行的任务,并尝试再提交当前任务

DiscardPolicy策略:
      该策略丢弃无法处理的任务,不做任何处理


     所有拒绝策略都继承自RejectedExecutionHandler接口,读者可根据实际情况需要扩展该接口实现自己的拒绝策略



扩展线程池
      ThreadPoolExecutor也是一个可扩展的线程池,它提供了beforeExecute,afterExecute,terminated3个接口对线程池调用任务进行控制

public class TestThreadPoolExecutor extends ThreadPoolExecutor {

    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
    }

    @Override
    protected void terminated() {
        super.terminated();
    }
}


总结:
      Executor框架提供了多功能的定制方式让开发者快速方便的实现定制的线程池,从而减少不必要的开发工作,且本身也提供多个扩展点让开发者自行扩展实现独特的业务逻辑
19
2
分享到:
评论
2 楼 mahongming 2014-06-27  
无界队列有误导人的嫌疑,看来大家都是相互复制的,LinkedBlockingQueue本身是可以设置长度的,如果不设置长度默认是int最大值,还有SynchronousQueue是缓冲区为1的队列,不是没有容量,是左手交右手的关系,既然是队列怎么可能没有容量呢
 public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }
1 楼 dongya1987 2014-06-27  
很喜欢博主的排版

相关推荐

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

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

     高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4  高并发编程第三阶段08讲 AtomicStampReference详解,解决CAS带来的ABA问题.mp4  高并发编程第三阶段09讲 AtomicIntegerArray,...

    java并发编程_线程池的使用方法(详解)

    下面小编就为大家带来一篇java并发编程_线程池的使用方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    深入理解高并发编程-Java线程池核心技术.rar

    深入理解高并发编程-Java线程池核心技术 全面详解Java线程池核心技术

    阿里专家级并发编程架构师课程-网盘链接提取码下载 .txt

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

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

     高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4  高并发编程第三阶段08讲 AtomicStampReference详解,解决CAS带来的ABA问题.mp4  高并发编程第三阶段09讲 AtomicIntegerArray,...

    Java并发编程原理与实战

    并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask...

    java并发编程理论基础精讲

    并发编程模型: 介绍不同的并发编程模型,如多生产者多消费者、读者写者、线程池等。 volatile 关键字: 解释 volatile 关键字的作用,探讨如何使用 volatile 实现线程间的可见性和有序性。 通过这份资源,将为您...

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

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

    JAVA高质量并发详解,多线程并发深入讲解

    是一本深入探讨Java并发编程的经典之作。本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本...

    龙果 java并发编程原理实战

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

    龙果java并发编程完整视频

    第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节...

    多线程与线程池技术详解(图书配套)

    本套视频为同名图书的配套视频,图书预计在2021.4上市

    Java线程池技术详解

    而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器...

    java并发编程

    第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 JVM虚拟机 JVM特点,结构与执行周期 JVM类加载机制 JVM运行时区数据 JVM执行引擎和垃圾回收 基础语法 理解Java中对象基础Object类 ...

    【2018最新最详细】并发多线程教程

    1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗? 7.三大性质总结:原子性、可见性以及有序性 8....

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

Global site tag (gtag.js) - Google Analytics