欢迎使用CSDN-markdown编辑器

来源:互联网 发布:泰瑞克埃文斯 数据 编辑:程序博客网 时间:2024/06/07 19:45

Java线程池

为了更好的利用压榨多核CPU的计算能力,使用多线程技术能够很好的提高CPU的利用率,但是线程的创建和销毁都需要耗费较大的系统资源。所以线程复用是十分必要的。Java并发编程包中有提供一组Executor框架

核心类和接口:

  • Executor
  • ExcutorService
  • AbstractExcutorService
  • ThreadPoolExcutor
  • Excutors
  • ScheduleExecutorService

ThreadPoolExecutor详解

ThreadPoolExcutor是创建线程池的核心类,其构造方法核心参数

  • coreSize:核心线程数,初始化线程池时创建。
  • maxSize:最大线程数
  • keepAliveTime:允许最大线程空闲保留时间,仅仅当coreSize

阻塞队列常用的有以下几种

直接提交队列 SysnchronousQueue:是一个特殊的阻塞队列,没有容量,每次删除操作都需要等待对应的插入操作,通常使用这个队列都要设置很大的maxSize,否则很容易就会执行拒绝策略
有界任务队列ArrayQueueQueue:除非线程池十分繁忙,否则均能确保核心线程数量维持在coreSize
无界队列LinkBlockQueue:无界队列没有容量限制,则除非资源耗尽的情况,否则不存在执行拒绝策略的时候。假如目前线程池已经达到coreSize,线程数就不会继续增加了,后来的任务无休止的进入队列,而又没有空闲的线程资源,则任务在队列中进行等待,如果线程创建速度和处理速度差距十分大,很容易造成资源耗尽。
优先任务队列PriorityBlockingQueue,可以根据任务自身的优先级顺序先后执行,确保系统性能的同时也有很好的质量保障

JDK内置拒绝策略
AbortPolicy:直接抛出异常,阻止系统正常执行。
CallerRunsPolicy:只要线程池没有关闭,该策略直接在调用者线程中,运行当前被丢弃任务,显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能急剧下降
DiscardOledestPolicy:该策略将丢弃最老的一个请求,也是即将被执行的一个任务,并尝试从新提交当前任务
DiscardPolicy:默默丢弃没法处理的任务,不给于任何处理