线程池

线程池解决了两个不同的问题:

  1. 减少线程创建的开销,能提高执行大量异步任务的效率
  2. 提供了一种限制和管理资源及线程的方法,并且还维护了一些基本的统计信息(如已完成的任务数)

线程池的使用对new Thread()的优势:

  1. 复用存在的线程,减少对象创建、消亡的开销,性能佳。
  2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
  3. 提供定时执行、定期执行、单线程、并发数控制等功能。

ThreadPoolExecutor

常用默认实现:

  1. Executors#newCachedThreadPool:无边界线程池,带有自动线程回收
  2. Executors#newFixedThreadPool:固定大小的线程池
  3. Executors#newSingleThreadExecutor:单个后台线程,大多数场景用于预初始化配置

有需要执行的任务进入线程池时

  • 当前线程数小于核心线程数时,创建线程。
  • 当前线程数大于等于核心线程数,且工作队列未满时,将任务放入工作队列。
  • 当前线程数大于等于核心线程数,且工作队列已满
    • 若线程数小于最大线程数,创建线程
    • 若线程数等于最大线程数,抛出异常,拒绝任务(具体处理方式取决于handler的策略)

主要参数

  • corePoolSize
    核心线程数。空闲时仍会保留在池中的线程数,除非设置了allowCoreThreadTimeOut参数

  • maximumPoolSize
    最大线程数。允许在池中的最大线程数

  • keepAliveTime
    存活时间。当前线程数大于核心线程数时,空余线程的最长存活时间

  • unit
    单位。keepAliveTime参数的时间单位

  • workQueue
    工作队列,接口类为阻塞队列。任务执行前存储的队列,只有通过submit方法提交的任务才会进入队列

  • threadFactory
    线程工厂。创建线程。默认使用Executors.defaultThreadFactory(),所有的线程都属于同一个ThreadGroup,都有相同的优先级,且均不是守护线程。
    (可用new NamedThreadFactory("test")来对线程池中的线程添加前缀标识)

  • handler
    任务丢弃策略。若线程池已经关闭、或线程池已满,那么新的任务会被拒绝。

    • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
    • ThreadPoolExecutor.DiscardPolicy:丢弃任务,但不抛出异常。
    • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(循环此过程)
    • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

BlockingQueue

BlockingQueue类型

  • ArrayBlockingQueue:由数组结构组成的有界阻塞队列
  • LinkedBlockingQueue:由链表结构组成的有界阻塞队列
  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列
  • DealyQueue:使用优先级队列实现的无界阻塞队列
  • SynchronousQueue:不存储元素的阻塞队列
  • LinkedTransferQueue:由链表结构组成的无界阻塞队列
  • LinkedBlockingDeque:由链表结构组成的双向阻塞队列

ArrayBlockingQueue

ArrayBlockingQueue是定长阻塞队列。原理是使用一个可重入锁和Condition进行并发控制(classic two-condition algorithm)。


参考资料:

  1. 精通ThreadPoolExcutor
  2. Java并发编程中四种线程池

Java 线程池作用及类型相关推荐

  1. java线程池有什么作用_java线程池的作用是什么?线程池介绍

    你知道java中线程池的作用是什么吗?那么究竟什么是线程池呢?都有哪些类型呢?让我们对以上的问题来进行详细的了解吧. 一.java线程池作用 第一个我们先来对它的作用进行一下简单的介绍,使用线程池的优 ...

  2. JAVA线程池原理以及几种线程池类型介绍

    在什么情况下使用线程池? 1.单个任务处理的时间比较短      2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销      2.如不使用线程池, ...

  3. java线程池分类_JAVA线程池有几种类型?

    常用的JAVA线程池有以下几种类型: 1.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 这种类型的线程池特点是 ...

  4. java线程池的使用例子,不愧是大佬

    京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...

  5. 由浅入深理解Java线程池及线程池的如何使用

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  6. Java 线程池艺术探索

    线程池 Wiki 上是这样解释的:Thread Pool 作用:利用线程池可以大大减少在创建和销毁线程上所花的时间以及系统资源的开销! 下面主要讲下线程池中最重要的一个类 ThreadPoolExec ...

  7. Java线程池Executor框架

    一.为什么要引入线程池 当存在大量并发任务时,创建.销毁线程需要很大的开销,运用线程池可以大大减小开销. 二.Executor框架 说明: Executor 执行器接口,该接口定义执行Runnable ...

  8. java 线程池 -- (Java并发)

    池技术是作为一个架构师必须深刻理解的东西,比如线程池,连接池,对象池,内存池等. 首先需要问一个问题:在c/c++ 编程中,你是如何操作一个任务的或者给一个线程添加任务的?如果你很清楚,那么你知道Ja ...

  9. Java线程池理解及用法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

最新文章

  1. xcode 编译静态库所要注意
  2. mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路
  3. PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation
  4. python tkinter 窗口禁止编辑_python tkinter禁用文本窗口中的换行
  5. 8.22最短路径讲解
  6. [转载] python 闭包和装饰器详解
  7. 关于垂直列行值转成水平行值及多列值转合并成单列值
  8. 算法分析之二叉树遍历
  9. python 微博自动点赞软件_python3 爬虫学习: 自动给你心上人的微博点赞
  10. linux代码折叠,Ubuntu中gedit中插件的安装之代码折叠插件
  11. php调用API支付接口 可个人使用,无需营业执照(使用第三方接口,调用的天工接口。)(转自刘68)...
  12. 有道云笔记分享_原来分享可以更美的 有道云笔记分享功能优雅变身
  13. “我爱淘”冲刺阶段Scrum站立会议10
  14. 谷粒商城-商城业务-检索服务
  15. 使用videojs播放m3u8视频
  16. 数据库置疑的处理方法
  17. 第十一章:MATLAB:符号运算(符号与数值,符号矩阵)
  18. docker 配置国内镜像地址
  19. ERP需求和销售管理 华夏
  20. vs调试时,没有断点在某处停下

热门文章

  1. vue+elementui导入、导出excel
  2. 服务器查看光模块信息的命令,能不能通过命令查看到端口上所接光模块的信息...
  3. 事务标识(xid)解析
  4. 背包问题一百块最少硬币数
  5. php 如何用op浏览器开发手机网站,PHP实现手机网站支付(兼容微信浏览器)
  6. 【Spring6】| Bean的生命周期(五步、七步、十步法剖析)
  7. 如何用python批量下载数据_Python批量下载地理空间数据云数据!Python无所不能!...
  8. 局域网如何连接打印机
  9. 【AI 交互式聊天】怎样实现财富自由??? 无需等待 Bing ChatGPT : 已经有一个免费自由使用的基于搜索结果响应的 AI 交互式聊天网站了!文中附 Perplexity 网站链接!
  10. [python3教程]第七章.输入输出(Input and Output)