首页 > 其他分享 >线程池创建方式

线程池创建方式

时间:2024-11-09 15:46:04浏览次数:1  
标签:方式 队列 创建 任务 线程 MAX new

线程池创建方式

   一、方式一:通过ThreadPoolExecutor构造函数来创建(推荐)

   方式二:通过 Executor 框架的工具类 Executors 来创建。

   Executors工具类提供的创建线程池的方法如下图所示:

   可以看出,通过Executors工具类可以创建多种类型的线程池,包括:

   1.  FixedThreadPool:固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。

   2. SingleThreadExecutor

   只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。

   3. CachedThreadPool: 可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

   4. ScheduledThreadPool

   给定的延迟后运行任务或者定期执行任务的线程池。

 《阿里巴巴 Java 开发手册》强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式,这样的处理方式让开发同学更加明确线程池的运行规则,规避资源耗尽的风险。

   Executors 返回线程池对象的弊端如下(后文会详细介绍到):

   1.  FixedThreadPool 和 SingleThreadExecutor

   使用的是无界的 LinkedBlockingQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

   部分源码如下:

// 无界队列 LinkedBlockingQueue
public static ExecutorService newFixedThreadPool(int nThreads) {

    return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());

}

// 无界队列 LinkedBlockingQueue
public static ExecutorService newSingleThreadExecutor() {

    return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));

}

   2. CachedThreadPool

   使用的是同步队列SynchronousQueue, 允许创建的线程数量为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。

// 同步队列 SynchronousQueue,没有容量,最大线程数是 Integer.MAX_VALUE`
public static ExecutorService newCachedThreadPool() {

    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

}

   3. ScheduledThreadPool 和 SingleThreadScheduledExecutor

   使用的无界的延迟阻塞队列 DelayedWorkQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

// DelayedWorkQueue(延迟阻塞队列)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}

 

 


  参考链接:

  https://javaguide.cn/java/concurrent/java-thread-pool-summary.html

标签:方式,队列,创建,任务,线程,MAX,new
From: https://www.cnblogs.com/hld123/p/18536880

相关文章

  • Redis的线程模型
    Redis的单线程模型详解        Redis的“单线程”模型主要指的是其主线程,这个主线程负责从客户端接收请求、解析命令、处理数据和返回响应。为了深入了解Redis单线程的具体工作流程,我们可以将其分为以下几个步骤:接收客户端请求Redis的主线程会通过网络接口接......
  • 使用HTML、CSS和JavaScript创建动态雪人和雪花效果
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • Web缓存中毒(Web Cache Poisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的
    Web缓存中毒(WebCachePoisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的缓存内容,使得用户在访问网站时,获得恶意内容或错误内容的攻击方式。这种攻击通常依赖于利用Web缓存的设计缺陷或未充分验证的请求参数,从而让缓存服务器存储并返回恶意的、篡改过的响应。工作原理......
  • 【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:1.暴力破解密码,造成用户信息泄露2.短信盗刷的安全问题,影响业务及导致用户投诉3.带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机......
  • LBA(Logical Block Addressing,逻辑块寻址)是一种硬盘寻址方式,用于将硬盘中的每个存储块
    LBA(逻辑块寻址)模式简介LBA(LogicalBlockAddressing,逻辑块寻址)是一种硬盘寻址方式,用于将硬盘中的每个存储块映射为一个唯一的逻辑地址。这种寻址方式使得操作系统能够通过逻辑地址而不是物理位置来访问硬盘数据,从而简化了硬盘的管理和数据访问。LBA的背景与作用在硬盘的传统寻......
  • 内存映射I/O(MMIO)是一种将硬件设备的控制寄存器和数据寄存器映射到处理器的地址空间中
    内存映射I/O(Memory-MappedI/O,简称MMIO)内存映射I/O(MMIO)是一种将硬件设备的控制寄存器和数据寄存器映射到处理器的地址空间中的技术。在这种方式下,操作系统和程序可以像访问内存一样,通过常规的内存访问指令(如读写)来访问硬件设备,而不需要使用专门的输入/输出指令。它简化了硬件访问......
  • python如何创建虚拟环境
    在Python中创建虚拟环境是一种常见的做法,它可以帮助你为不同的项目创建隔离的Python环境,避免库版本冲突。以下是使用Python内置的venv模块创建虚拟环境的步骤:确保Python已安装:首先,确保你的系统中已经安装了Python。你可以通过在终端或命令提示符中运行python--version或python3......
  • 关于 Google 搜索运作方式的深度指南
    Google搜索是一款全自动搜索引擎,会使用名为“网页抓取工具”的软件定期探索网络,找出可添加到Google索引中的网页。实际上,Google搜索结果中收录的大多数网页都不是手动提交的,而是我们的网页抓取工具在探索网络时找到并自动添加的。本文档从网站的角度介绍了Google搜索运作方......
  • 创建实用、可靠、以用户为中心的内容
    Google的自动排名系统旨在呈现实用且可靠的信息,这些信息主要用于让用户受益,而不是提高在搜索引擎中的排名。此页面旨在帮助创作者评估自己制作的是否是此类内容。自行评估您的内容根据这些问题评估您自己的内容,有助于评估您创作的内容是否实用且可靠。除了对照这些问题自问自答,......
  • 微信小程序的两种视频录制方式
    基础库1.3.0开始支持,低版本需做兼容处理。以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:支持,需要小程序基础库版本不低于2.18.1微信Windows版:支持微信Mac版:支持功能描述打开另一个小程序参数Objectobject属性......