当前位置: 首页 > wzjs >正文

网站系统 建设和软件岗位职责wordpress 总站模板

网站系统 建设和软件岗位职责,wordpress 总站模板,网站jianshe,建筑施工企业文章目录 多线程基础系列-线程池1. 何为线程池?2. 为什么要使用线程池?3. 线程池的工作原理3.1 线程池的几个关键参数3.2 线程池的工作原理 4. Java中的线程池实现4.1 Executor 框架4.2 线程池的创建方式4.3 线程池的选择4.3 有必要提一提ThreadPoolTask…

文章目录

  • 多线程基础系列-线程池
    • 1. 何为线程池?
    • 2. 为什么要使用线程池?
    • 3. 线程池的工作原理
      • 3.1 线程池的几个关键参数
      • 3.2 线程池的工作原理
    • 4. Java中的线程池实现
      • 4.1 Executor 框架
      • 4.2 线程池的创建方式
      • 4.3 线程池的选择
      • 4.3 有必要提一提`ThreadPoolTaskExecutor`

多线程基础系列-线程池

多线程编程是提升程序的性能和响应速度的重要手段,是我们开发人员手中的一把利器。本文将深入探讨线程池的相关知识,包括其基本概念、工作原理、优势以及在Java中的实现方式,帮助读者更好地理解和运用线程池。

1. 何为线程池?

线程池是一种线程使用模式,它维护了一个可复用的线程集合。当有任务需要执行时,线程池会从池中取出一个空闲线程来执行该任务,任务执行完毕后,线程并不会立即销毁,而是返回线程池中等待下一次被复用。这种模式可以有效减少线程创建和销毁的开销,提高程序的执行效率。

换句话,以前我们执行任务需要手动创建线程,以及做一些复杂的线程管控,现在我们只需要从一个池中拿一个线程来执行我们的任务便可

2. 为什么要使用线程池?

  1. 减少开销:避免频繁创建和销毁线程带来的资源消耗。
  2. 提高响应速度:复用已有线程快速响应任务请求。
  3. 合理利用资源:根据系统资源和任务特性合理控制线程数量,防止资源耗尽或闲置。
  4. 便于管理监控:方便对线程进行统一管理,监控线程状态和任务执行情况,便于调优和排查问题。

3. 线程池的工作原理

3.1 线程池的几个关键参数

  • corePoolSize:核心线程数
    线程池中常驻的核心线程数量。即使线程空闲,这部分线程也会保留在线程池中,不会被回收。只有在工作队列满并且当前线程数小于最大线程数时才会创建新的线程。

  • maximumPoolSize:最大线程数
    线程池能容纳的最大线程数量。当活动线程达到这个数值后,新来的任务如果不能放入任务队列将被拒绝处理。

  • keepAliveTime:空闲线程存活时间
    当线程池中的线程数量超过核心线程数时,多余的空闲线程在等待新任务最长时间达到keepAliveTime后,如果还没有新任务到来,那么这些线程将被终止以节省资源。

  • workQueue:任务队列
    用于保存等待执行的任务的阻塞队列。不同的队列实现会影响线程池的行为,常见的有ArrayBlockingQueue(固定大小)、LinkedBlockingQueue(无界或有限界限)、SynchronousQueue(直接传递,没有容量)等。

  • handler:拒绝策略
    当线程池和任务队列都达到饱和状态时(即无法再接受新任务),如何处理新提交的任务。JDK内置了几种拒绝策略:

AbortPolicy:默认策略,丢弃任务并抛出RejectedExecutionException异常。
CallerRunsPolicy:调用者运行策略,直接在调用者线程中执行被拒绝的任务。
DiscardPolicy:静默丢弃任务,不抛出任何异常。
DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试重新提交当前任务。

3.2 线程池的工作原理

  1. 线程池初始化:根据corePoolSize初始化核心线程。
  2. 任务提交:当任务提交到线程池时,根据当前线程数判断:
    • 若当前线程数小于corePoolSize,创建新的线程执行任务。
    • 若当前线程数大于或等于corePoolSize,任务被加入workQueue队列。
  3. 任务处理:当有空闲线程时,从workQueue中取出任务执行。
  4. 线程扩展:若队列已满且当前线程数小于maximumPoolSize,创建新的线程处理任务。
  5. 线程回收:当线程空闲时间超过keepAliveTime,多余的线程会被回收,直到线程数不超过corePoolSize。
  6. 拒绝策略:若队列已满且当前线程数达到maximumPoolSize,则根据拒绝策略处理新任务。

4. Java中的线程池实现

4.1 Executor 框架

Java提供了java.util.concurrent包来支持线程池的创建和管理。其中,ThreadPoolExecutor类是线程池的核心实现类,它提供了丰富的配置选项和灵活的线程管理功能。

示例代码:

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
);

4.2 线程池的创建方式

线程池的创建方法总共有 7 种,但总体来说可分为 2 类:

  • 通过 ThreadPoolExecutor 创建的线程池
  • 通过 Executors 创建的线程池

线程池的创建方式总共包含以下 7 种(其中 6 种是通过 Executors 创建的,1 种是通过 ThreadPoolExecutor 创建的):

  1. Executors.newFixedThreadPool():创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待;
  2. Executors.newCachedThreadPool():创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收多余的线程,若线程数不够,则新建线程;
  3. Executors.newScheduledThreadPool():创建一个可以执行延迟任务的线程池;
  4. Executors.newSingleThreadExecutor():创建单个线程数的线程池,它可以保证先进先出的执行顺序;
  5. Executors.newSingleThreadScheduledExecutor():创建一个单线程的可以执行延迟任务的线程池;
  6. Executors.newWorkStealingPool():创建一个抢占式执行的线程池(任务执行顺序不确定)JDK 1.8 添加
  7. ThreadPoolExecutor:最原始的创建线程池的方式,它包含了 7 个参数可供设置

单线程池的意义: 虽然 newSingleThreadExecutornewSingleThreadScheduledExecutor 是单线程池,但提供了工作队列,生命周期管理,工作线程维护等功能。

4.3 线程池的选择

我们看看《阿里巴巴Java开发手册终极版》中给我们的建议:

强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:
1)FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2)CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

4.3 有必要提一提ThreadPoolTaskExecutor

ThreadPoolTaskExecutor 是 Spring 框架对 ThreadPoolExecutor 的封装,用于在 Spring 应用中更方便地管理线程池。它继承自 AbstractExecutorService,并提供了与 Spring 集成的便利性。

抱歉刚才的表格格式没有完全符合Markdown规范。以下是完全符合Markdown格式的表格:
markdown复制

特性ThreadPoolExecutorThreadPoolTaskExecutor
语言层面Java 标准库Spring 框架
配置方式手动创建,直接使用构造方法通过 Spring 配置类或 XML 配置
与 Spring 的集成需要手动管理生命周期自动管理生命周期,支持 Spring 生命周期管理
线程池参数提供丰富的配置选项提供类似的配置选项,更易与 Spring 集成
使用场景适用于任何 Java 应用专为 Spring 应用设计,适合与 @Async@Scheduled 集成
底层实现基于 java.util.concurrent基于 ThreadPoolExecutor 封装

文章转载自:

http://f8zWgH8g.jcfqg.cn
http://4FdlnAaq.jcfqg.cn
http://zboHbYzK.jcfqg.cn
http://JN2iqhff.jcfqg.cn
http://Sw1pXKtg.jcfqg.cn
http://hDTfmmoR.jcfqg.cn
http://lKrNKgAf.jcfqg.cn
http://CUSmTyts.jcfqg.cn
http://s6HhXrRg.jcfqg.cn
http://cjaP4qCx.jcfqg.cn
http://r260D0fV.jcfqg.cn
http://dhHycFAB.jcfqg.cn
http://7clPAm2l.jcfqg.cn
http://XBtgTTYl.jcfqg.cn
http://TARDyWH1.jcfqg.cn
http://BFAgU6vo.jcfqg.cn
http://RNykgPLB.jcfqg.cn
http://d0roGQoW.jcfqg.cn
http://nyGpCzkw.jcfqg.cn
http://QWmzbN0A.jcfqg.cn
http://rWLu4D7n.jcfqg.cn
http://h4imZVDa.jcfqg.cn
http://6wusvVJN.jcfqg.cn
http://KEVVyacV.jcfqg.cn
http://XML0cjfL.jcfqg.cn
http://svaYVLtf.jcfqg.cn
http://z9JPgg3k.jcfqg.cn
http://wgFK6vOM.jcfqg.cn
http://CJkxXssL.jcfqg.cn
http://0mODQGGD.jcfqg.cn
http://www.dtcms.com/wzjs/652592.html

相关文章:

  • 坊网站建设上海网站建设服务分录
  • 建网站主要工具厦门网站做优化
  • 网站建设开发公司地址厦门住房建设局网站首页
  • 男女生做爰视频网站网站开发代码实例
  • 建个网站需要多少钱网店设计分析
  • 网站制作常见的问题seo网站优化外包
  • 织梦搬家 网站空白滨江专业网页制作哪家好
  • 上海紫昌网站建设wordpress 网址导航页
  • 网站建设基础教学设计phpcms网站备份
  • 东莞网站建设公司好企业资源计划系统
  • php网站设计要学多久劳力士手表价格及图片 官方网站
  • 做网站专业公司电话职高网站建设知识点
  • 网站开发中的著作权归属建站方法
  • 网站实名认证 备案如何自己做小程序免费
  • 云南公司建网站多少钱网站的建设时间表
  • 运城市盐湖区姚孟精诚网站开发中心视频剪辑制作
  • 郑州网站建设公司排行榜口碑好网站建设
  • 济南 域名注册 网站建设wordpress简繁转换
  • 做电商网站要备案吗上海网站营销seo方案
  • 中国建设银行数据管理部网站个人接做网站多少钱
  • 山东高密网站建设wordpress 页脚插件
  • iis7.0搭建网站网页图片不能正常显示的原因
  • 湖北网站建设专家seo优化与sem推广有什么关系
  • 做网站所需要的资质网页制作百度百科
  • 做网站不给源代码专业网站建设技术
  • 毕业设计代做网站价格asp 网站 购物车
  • 廊坊文安建设局网站设计logo的软件有哪些
  • 做网站的系统古建设计网站
  • 怎么做网站怎么引入广告挣钱企业的网站建设与设计论文
  • 做餐饮网站做文化建设的网站