java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。

从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。

一、corePoolSize 线程池核心线程大小

线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建一个新线程来处理这个任务。

二、maximumPoolSize 线程池最大线程数量

当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

三、keepAliveTime 空闲线程存活时间

一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定

四、unit 空闲线程存活时间单位

keepAliveTime的计量单位

五、workQueue 工作队列

新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。jdk中提供了四种工作队列:

①ArrayBlockingQueue

基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。

②LinkedBlockingQuene

基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。

③SynchronousQuene

一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。

④PriorityBlockingQueue

具有优先级的无界阻塞队列,优先级通过参数Comparator实现。

六、threadFactory 线程工厂

创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等

七、handler 拒绝策略

当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题的,jdk中提供了4中拒绝策略:

①CallerRunsPolicy

该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。

②AbortPolicy

该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。

③DiscardPolicy

该策略下,直接丢弃任务,什么都不做。

④DiscardOldestPolicy

该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列

到此,构造线程池时的七个参数,就全部介绍完毕了。

个人独立博客:JAVA线程池七个参数详解 - IT小跟班的技术博客

Java线程池七个参数详解相关推荐

  1. Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

    源码简介 ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交.线程管理.监控等方法. 下面是ThreadPoolExecutor类的构造 ...

  2. Java线程池及配置参数详解

    一.线程池的优点 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执 ...

  3. Java 线程池原理和队列详解

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51701508 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  4. java线程池使用最全详解

    线程池使用 前言 在执行一个异步任务或并发任务时,往往是通过直接new Thread()方法来创建新的线程,这样做弊端较多,更好的解决方案是合理地利用线程池,线程池的优势很明显,如下: 降低系统资源消 ...

  5. Java线程池原理与实例详解

    Wiki 采用new Thread的方式产生多线程,可能有以下一些问题:  线程的创建和销毁开销很大,尤其是有些线程的存在时间较短:  线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...

  6. ThreadPoolExecutor线程池使用及参数详解

    先贴一段实际应用代码,应用场景是一个基于http请求拦截的用户行为分析数据录入片段: package com.howbuy.coop.interceptor;import java.sql.Times ...

  7. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线 ...

  8. future java 原理_Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...

  9. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

最新文章

  1. 安装HCL遇到的问题
  2. css解决div子元素margin溢出的问题
  3. Linux 相关发音
  4. 【界面无法显示】getStorageInfoSync和getStorageSync的区别
  5. 九月腾讯,创新工场,淘宝等公司最新面试三十题(更新至10.04)
  6. 互联网公司忽悠员工的黑话,套路太深了。
  7. 字符串函数rpartition与partition
  8. Spring配置中bean的id和name属性的区别
  9. pyinstaller打包含有openCV库时缺失config文件报错
  10. 重写弹幕射击游戏的记录
  11. android javacv,【首发】AndroidStudio配置JavaCV环境
  12. Eclipse美化操作
  13. ruby on rails中的分页插件Kaminari
  14. 编写MTK6737平台的GPIO驱动例程(一)
  15. 106、七氟丙烷灭火系统的灭火机理
  16. 【图片无损压缩利器】Image Optimizer
  17. Python 爬虫下载喜马拉雅音频文件
  18. RetinaNet模型在DDSM数据集的应用问题(2)
  19. 前端一键换肤换肤简单探索
  20. 如何设计游戏中道具功能(一)

热门文章

  1. MySQL:数据类型
  2. java异步延迟任务执行
  3. 华中大计算机专业出国留学情况,华中大
  4. Java设计者模式之装饰器模式
  5. 男生有妹妹的人很幸福哦!希望他们能够珍惜自己的...
  6. 今天是我第一次发博客,我看了一本书是阳光姐姐的青蛙王子副班长,里面有博客这个内容,我的心充满了好奇于是开了一个博客。虽然我只是个小学生,但我有许多想写的。希望你们能支持,谢谢
  7. 计算机在线考试系统,高效刷题考试平台!
  8. canvas画边框不一样的矩形
  9. 【Jmeter学习01】Jmeter的介绍与下载安装
  10. 国产运动蓝牙耳机,四款性能好的运动蓝牙耳机