首页 > 编程语言 >java线程池详解

java线程池详解

时间:2023-03-29 13:57:24浏览次数:30  
标签:java 队列 核心 任务 详解 线程 创建 如果

为什么要使用线程池

ExecutorService利用池化线程执行任务,Executors的工厂方法可以创建线程池

线程池解决了两个问题:

  1. 减少每个线程创建消耗的时间,复用线程
  2. 提供管理线程,资源的边界

为了适应不同的业务需求,ExecutorService提供了很多可调节的参数和扩展机制,主要的参数解析如下:

  1. 核心线程数和最大线程数
    ThreadPoolExecutor将会根据核心线程数和最大线程数自动调节线程数大小,当一个新任务被提交的时候如果线程池线程数小于核心线程数,即使这个时候其他线程是空闲的,新的线程也将被创建去处理请求,如果线程池线程数大于核心线程数小于最大线程数,那么只有当任务队列已满的情况下,新的线程才会被创建。如果创建的核心线程数和最大线程数相同,你可以创建一个具有固定线程数的线程池,如果设置最大线程数为一个非常大的数,例如Integer.MAX_VALUE,那么线程池讲允许无限创建线程去执行并发任务。通常情况下,核心线程数和最大线程数在构造线程池的时候就已经确定,但是可以通过setCorePoolSize和setMaximumPoolSize进行调节

  2. 按需构造
    默认情况下,即使是核心线程也是在任务到达的时候才会被初始化,但是如果你使用了 prestartCoreThread 或者prestartAllCoreThreads,那么可以构造一个非空的线程池

  3. 创建新的线程
    线程通过ThreadFactory被创建,如果构造的时候不指定ThreadFactory,那么默认为Executors.defaultThreadFactory。defaultThreadFactory创建的线程的线程组相同,线程优先级为NORM_PRIORITY,并且为非守护线程状态。通过传递一个不同的ThreadFactory,你可以改变线程的名称,线程组,线程优先级,守护状态等等,如果ThreadFactory创建线程失败,executor能够继续存活但不能继续处理任务,线程应该具备modifyThread的运行时权限,如果使用池的工作线程或其他线程不具有此权限,则服务可能会降级:配置更改可能无法及时生效,并且关闭池可能仍处于可以终止但未完成的状态。

  4. 线程存活时间
    如果线程数超过核心线程数,那么超过核心线程数的线程将在空闲时间超过存活时间后消亡,这种机制保证了在线程池不活跃的收资源能够被回收,当线程池变得活跃后,新的线程又会被创建,如果存活时间设置为Integer.MAX_VALUE,那么线程将不会被回收, allowCoreThreadTimeOut(boolean)方法可以控制核心线程数是否被回收,前提是存活时间不为零

  5. 阻塞队列
    任何的阻塞队列都是被用于传递和保存任务,阻塞队列的使用和线程池的大小相关

  • 少于核心线程数的时候,Executor将不会把任务放进队列,而是直接创建新线程
  • 如果线程数超过核心线程数,那么Executor将优先将任务放进队列,而不是创建新线程
  • 如果一个请求无法被放进阻塞队列(已满),那么新的线程将会被创建,如果超过了核心线程数,那么任务将会被拒绝

队列的三个通用策略

  1. 直接传递
  2. 无界队列
  3. 有界队列

jdk自带的几种线程池

标签:java,队列,核心,任务,详解,线程,创建,如果
From: https://www.cnblogs.com/itqczzz/p/17266660.html

相关文章

  • 初识java
    目录JavaSE认识JavaJava特性Java核心机制垃圾回收机制跨平台原理常用DOS命令注释JavaSE认识JavaJava特性跨平台/可移植性(一次编译到处运行)、安全性、面向对象、简单性......
  • 存储动态列的结果集(行列互转)--java、mybatis、orcale
    业务上需要存储动态列的数据通过行列互转的方式实现数据库中动态列的几种设计思路使用数据库DDL进行动态创建使用数据库预留字段(宽表)使用数据库中的json数据......
  • Exception in thread "main" javax.mail.MessagingException: Could not connect to S
    写一个QQ邮件发送,运行时报下面的错误。  百度翻译是:线程“main”javax.mail.MessagingException异常:无法连接到SMTP主机:SMTP.qq.com,端口:465;嵌套异常为:javax.net.ssl.s......
  • 每日总结-23.3.29-利于云服务器和javaweb简单实现一个网站
    3月29日总结今日使用云服务器和tomcat实现了简单网站的搭建。使用工具(个人体验,仅作参考,使用其他版本或工具应该也行):1.移动云新人体验免费云服务器一台。(个人专享:通......
  • 手机芯片的命名详解
    转载:https://blog.csdn.net/cookie_plus/article/details/117663705 一、分类现在做手机处理器的主要有五家厂商,分别为华为,三星,苹果,联发科和高通。华为,三星,苹果既做手机......
  • 多线程 互斥锁与读写锁 概念
    一、多线程lock互斥锁简述多线程环境中,不使用lock锁,会形成竞争条件,导致A线程与B线程数据使用冲突。使用lock锁可以保证当有线程操作某个共享资源时,能使该代码块按照指......
  • 初识Java
    JavaSE认识JavaJava特性跨平台/可移植性(一次编译到处运行)、安全性、面向对象、简单性、高性能、分布式、多线程、健壮性。Java核心机制垃圾回收机制不需要程序员去管......
  • java中的循环语句
    有些程序段在某些条件下重复执行多次,称为循环结构程序。Java提供了3种循环语句实现循环结构,包括while语句、do-while语句、for语句。它们的共同点是根据给定条件来判断是否......
  • package.json 配置详解
    package.json配置说明详解基础配置{"name":"my-package",//包名必填字段"version":"1.0.0",//版本号必填字段"description":"Thisismyfirstnpmpa......
  • 多线程socketserver
    模块:socketservertcp协议:服务端:importsocketserverclassMyRequestHandle(socketserver.BaseRequestHandler):defhandle(self):#print(self.request)#......