线程池的工作原理

一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行

任务的任务队列(阻塞队列) 。

一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行

任务的任务队列(阻塞队列) 。

默认情况下, 在创建了线程池后, 线程池中的线程数为 0。 当任务提交给

线程池之后的处理策略如下:

1 如果此时线程池中的数量小于 corePoolSize(核心池的大小) , 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务(也就是每来一个任务, 就要创建一个线程来执行任务) 。

2 如果此时线程池中的数量大于等于 corePoolSize, 但是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。

3 如果此时线程池中的数量大于等于 corePoolSize , 缓 冲 队 列workQueue 满, 并且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。

4 如果 此时 线程 池中 的数量 大 于 等 于 corePoolSize, 缓 冲 队列workQueue 满, 并且线程池中的数量等于 maximumPoolSize, 那么通过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 如果三者都满了, 使用handler 处理被拒绝的任务。

特别注意, 在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。 当线程池中线程数量大于 corePoolSize 时, 如果某线程空闲时间超过 keepAliveTime, 线程将被终止, 直至线程池中的线程数目不大于 corePoolSize。 这样, 线程池可以动态的调整池中的线程数。

使用线程池的好处

1.通过重复利用已创建的线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。

2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。

3.提高线程的可管理性。 使用线程池可以对线程进行统一的分配和监控。

4.如果不使用线程池, 有可能造成系统创建大量线程而导致消耗完系统内存。

线程池的注意事项

虽然线程池是构建多线程应用程序的强大机制, 但使用它并不是没有风险的。

(1) 线程池的大小。 多线程应用并非线程越多越好, 需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。 一般来说, 如果代码结构合理的话, 线程数目与 CPU数量相适合即可。 如果线程运行时可能出现阻塞现象, 可相应增加池的大小; 如有必要可采用自适应算法来动态调整线程池的大小, 以提高 CPU 的有效利用率和系统的整体性能。

(2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。

(3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。

学习交流群:669823128

java 工作池_Java线程池的工作原理,好处和注意事项相关推荐

  1. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  2. java线程池_Java 线程池 8 大拒绝策略,面试必问!

    点击上方 Java后端,选择设为星标 技术博文,及时送达 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的 ...

  3. java 队列线程池_Java线程池Executor使用

    原标题:Java线程池Executor使用 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:减少系统对于,外部 服务的响应时间的等待.第 ...

  4. java threadpoolexecutor 实例_Java线程池(ThreadPoolExecutor)示例

    Java线程池管理工作线程池,它包含一个队列,用于保持任务等待执行.我们可以使用ThreadPoolExecutor在Java中创建线程池. Java线程池管理Runnable线程的集合.工作线程从队 ...

  5. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  6. java callable 线程池_JAVA 线程池之Callable返回结果

    本文介绍如何向线程池提交任务,并获得任务的执行结果.然后模拟 线程池中的线程在执行任务的过程中抛出异常时,该如何处理. 一,执行具体任务的线程类 要想 获得 线程的执行结果,需实现Callable接口 ...

  7. 中fifo算法_java线程池,工作窃取算法

    前言 在上一篇<java线程池,Executors阿里开发规范中为什么禁止使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了 ...

  8. 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )

    文章目录 一.线程池作用 二.线程池种类 三.线程池工作机制 四.线程池任务调度源码解析 一.线程池作用 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ② 统 ...

  9. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. 【Redis学习笔记】2018-05-30 Redis源码学习之Ziplist、Server
  2. redis 一主二从
  3. Android(三)——将程序打包成APK文件,进行APK签名以及反编译APK
  4. 判断泛型的值是否为default(T)
  5. server2008 sql 账号只读权限_SQL Server 2008数据库创建用户只读权限的两种方式(转载)...
  6. 统一编址 独立编址 寻址空间
  7. java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一,大厂 HR 如何面试
  8. 使用pynput模块监听用户键盘输入,保存至txt
  9. java list 某个重复列_Java 开发的编程噩梦,这些坑你没踩过算我输
  10. iOS多线程(一):GCD的基本使用
  11. 剑指offer-刷题总结
  12. win10 使用量产工具后usb无法 识别硬件修复 Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Contro
  13. 计算机英语加密信息,计算机信息安全中数据加密技术-计算机英语论文-计算机论文(10页)-原创力文档...
  14. win10系统如何开启休眠模式?
  15. php英语单词大全95
  16. Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.Identifi
  17. eclipse 汉化教程(中文语言包的下载和安装)
  18. 葡,西两国发展史(大航海时代)启示
  19. Flutter 利用 Hero 动效实现列表详情页的无缝切换
  20. 接口幂等性设计与实现

热门文章

  1. 如何在家搭建oracle,oracle基本操作,自己亲手做过了
  2. list python 访问 键值对_学完Python,我决定熬夜整理这篇总结...
  3. RHEL 8 - 用OpenSCAP工具对容器镜像进行漏洞安全合规扫描,并修复
  4. 依赖反转原理,IoC容器和依赖注入:第1部分
  5. Redis:复制,第3部分——redis-py和Python中的Redi哨兵一起使用
  6. 从SQL Server生成文档
  7. SQL 使用总结一( 规范、基础)
  8. odoo10在win7下的安装详细步骤
  9. 东方时尚网上约车的用户名密码是什么_网站制作要学什么、在现代网页设计中,动效常见的几种用法...
  10. C语言的延时程序怎么改,C语言编程,怎么用按键来改变延时的长短?