【后端面经-java】java线程池满的处理策略

这篇具有很好参考价值的文章主要介绍了【后端面经-java】java线程池满的处理策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 1. 线程池介绍
    • 1.1 基本作用
    • 1.2 处理流程
    • 1.3 线程池大小设置
    • 1.4 线程池参数
  • 2. 线程池满的处理策略
    • 2.1 默认--拒绝策略handler
  • 3. 参考资料

1. 线程池介绍

1.1 基本作用

对多个线程使用的资源进行集中管理。

  • 降低资源消耗:
    • 复用线程,降低线程创建和销毁造成的消耗;
  • 线程资源管理
    • 提高管理效率;
  • 提高线程的响应速度
    • 在线程池中随时等待被执行,CPU不用等到线程创建时间;

1.2 处理流程

当一个线程进入线程池之后,会进行如下的处理步骤:

  • 首先查看核心线程池是否满

    • 如果没满,线程将在此处等待被调度执行;
  • 如果核心线程池满了,那么查看队列是否满了

    • 如果没满,线程在这里等待进入核心线程池;
  • 如果队列也满了,那么查看临时线程池是否满了

    • 如果没满,创建临时线程来处理任务。
  • 如果临时线程池也满了,那就要根据2.线程池满的处理策略进行线程处理。
    如下图所示:
    【后端面经-java】java线程池满的处理策略

当调度者需要调度一个线程的时候,按照如下步骤:

  • 核心线程池中获取一个线程,执行任务;
  • 如果线程处于等待态,获取下一个线程继续执行;
  • 某一个任务执行完毕后,线程返回就绪态而不是终止态,放入线程池中复用。

1.3 线程池大小设置

  • CPU操作密集的任务

    • 由于线程操作多半需要占据CPU资源,因此一个线程运行的过程中基本上很少会出现某一线程进入等待态而调度下一个线程的情况;
    • 因此CPU调度线程的速度偏慢,因此线程池大小不应过大,一般为CPU核心数+1;这样可以保证CPU的效率最高;
    • 如果线程池容量过大,那么不仅对CPU运行是一个很大的负担,而且大量线程都处于等待运行的阶段,等待时间过长,可能出现响应过慢的情况。
  • I/O操作密集的任务

    • 对于I/O操作密集的任务,线程对于CPU的资源占用常常被I/O等操作打断,此时线程进入等待态,CPU继续调度下一个线程;
    • CPU调度线程的速度偏快,线程池大小可以尽量大一点,这样能够保障CPU资源的利用率,提高线程执行效率;
    • 如果线程池容量过小,CPU在调度一段时间之后,所有线程都进入等待态,此时就会出现CPU空等的情况,不利于资源有效利用。
  • 注意

  • 对于就绪态等待态等线程状态和生命周期的介绍,可参考这篇博客

1.4 线程池参数

线程池的构造方法如下所示:

public ThreadPoolExecutor(int corePoolSize,
                        int maximumPoolSize,
                        long keepAliveTime,
                        TimeUnit unit,
                        BlockingQueue<Runnable> workQueue,
                        ThreadFactory threadFactory,
                        RejectedExecutionHandler handler);

线程池的创建包含以下参数:

  • corePoolSize:核心线程池容量大小
    • 如前文所述,线程进行核心线程池即可等待调度执行
  • maximumPoolSize:最大线程池大小
    • 通过这个来判断线程池是否已满。
      MaximumPoolSize = CorePoolSize + WorkQueue + 临时线程池大小
      
  • workQueue:任务队列
    • 无法进入核心线程池的线程将进入任务队列等待进入池中;
    • 阻塞队列对象,一般需要设定容量大小
  • keepAliveTime:线程存活时间
    • 线程池已满的情况下,空闲多余的线程有个存活时间,超过这个时间还没有进入核心线程池,那么将被丢弃;
  • timeUnit:线程存活时间单位
    • 配合线程存活时间使用;
  • handler:拒绝策略
    • 当前线程池满了之后(超过maxmumPoolSize),对于新的线程的处理策略,
    • 包括四种,在2.1 默认--拒绝策略handler有详细论述
  • threadFactory:线程工厂
    • 用于创建线程池中的线程。

2. 线程池满的处理策略

2.1 默认--拒绝策略handler

线程池满了之后,一般的处理方式是丢弃某一线程,并且抛出异常。
Handler有四种策略:

  • AbortPolicy:直接抛出异常RejectedExecutionException
  • DiscardPolicy:直接丢弃任务,但是不抛出异常( 默认)。
  • DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新尝试执行任务;
  • CallerRunsPolicy:由调用线程处理该任务。

3. 参考资料

参考博客-1
参考博客-2
参考博客-3
参考博客-4文章来源地址https://www.toymoban.com/news/detail-493261.html

到了这里,关于【后端面经-java】java线程池满的处理策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于sql server 2019 安装目录所在分区自动写满的问题

    找到sql server 2019 的安装目录,如:X:Microsoft Sql Server。其中,X:是根目录。 在sql server 2019 的安装目录X:Microsoft Sql Server下,找到路径: MSSQL15.MSSQLSERVERLogPolyBasedump 删除除.log文件外的所有文件。 这些文件是PolyBase 相关服务产生的日志,单个将近500MB。 1.PolyBase用于Sql Server 与

    2024年02月09日
    浏览(44)
  • linux系统下 devmappercentos-root目录被占满的解决方式

    可以看到/dev/mapper/centos-root 已经快满了,这时候就算启动hdfs,也会是强制性的进入安全模式,不让写数据 使用kill -9 进程号,杀掉对应进程即可 4.1查看磁盘编号 4.2创建pv 4.3把pv加入vg中,相当于扩充vg的大小 4.3.1 vgs :先使用vgs查看vg组 4.3.2 vgextend centos /dev/sda4:扩展vg,使用

    2024年04月25日
    浏览(21)
  • centos系统/dev/mapper/centos-root目录被占满的解决方式

    最近在做虚拟机部署docker微服务时,发现磁盘内存占满,无法进行操作。 open /var/lib/dpkg/info/libc6:amd64.templates: no space left on device 接下来就写下我在备份虚拟机上如何解决根目录被占满的问题: 可以看到/dev/mapper/centos-root 已经快满了,这时候就算启动hdfs,也会是强制性的进入

    2024年02月16日
    浏览(31)
  • java八股文面试[多线程]——线程池拒绝策略

    四种线程池拒绝策略(handler)           当线程池的线程数达到最大线程数时,需要执行拒绝策略。拒绝策略需要实现 RejectedExecutionHandler 接口,并实现 rejectedExecution (Runnable r, ThreadPoolExecutor executor) 方法。不过 Executors 框架已经为我们实现了 4 种拒绝策略: Abort Policy(默认

    2024年02月10日
    浏览(35)
  • Java中线程池的使用及原理(附带线程池拒绝策略介绍)

    目录 1.使用线程池的目的 2.线程池的使用及原理 3.生动讲解拒绝策略: 4.自己实现一个简单的线程池 5.线程数的决定方法 6.总结 希望各位大佬能多多点赞关注收藏,有了你们的支持,我也能更有动力的向你们学习不是(手动狗头)!!! 在知道线程池之前,每当我们需要一

    2024年04月17日
    浏览(29)
  • Java多线程(3)---锁策略、CAS和JUC

    目录 前言 一.锁策略 1.1乐观锁和悲观锁 ⭐ 两者的概念 ⭐实现方法 1.2读写锁  ⭐概念 ⭐实现方法 1.3重量级锁和轻量级锁 1.4自旋锁和挂起等待锁 ⭐概念 ⭐代码实现 1.5公平锁和非公平锁 1.6可重入锁和不可重入锁 二.CAS 2.1为什么需要CAS 2.2CAS是什么 ⭐CAS的介绍 ⭐CAS工作原理

    2024年02月13日
    浏览(39)
  • java 线程池实现多线程处理list数据

    需要注意的问题点,多线程处理List数据可能发生线程不安全, 引入CopyOnWriteArrayList,Semaphore解决,或者加锁解决问题;所有线程执行完毕后再进行后续业务的处理,引入awaitTermination()方法。 发现上述逻辑有问题,被其他资料误导,awaitTermination并不是上述描述的作用。为了保

    2024年02月11日
    浏览(30)
  • Java 多线程批量处理数据

    1 需求 在项目开发中需要处理100万多的数据,这些数据需要从mysql数据库中读取出来,再通过调用其他平台的接口推送数据。由于时间紧迫,数据需要在短时间内完成推送,采用单线程推送很慢,所以采用多线程推送来提高效率。 2 配置多线程 2.1 application.yml 2.2 创建ThreadPoo

    2024年02月22日
    浏览(31)
  • java 多线程处理大量并发数据

    Java中多线程是一种处理数据的常见方式,它可以同时执行多个线程以提高程序的性能和效率。下面是一个使用多线程处理数据的示例代码: 在上面的代码中,我们创建了一个数组 data 来存储待处理的数据。然后,我们创建了一个线程数组 threads ,用于存储要执行的线程。 通

    2024年02月09日
    浏览(45)
  • Java使用线程池批量处理数据操作

    疑问思路: 1.如何保证数据按顺序批量处理 2.如何保证数据全部处理完统一返回 3.如何保证是多任务异步操作 4.如何提高运行效率,减少运行时间 1.使用ArrayList 插入数据有序且可重复 2.CountDownLatch / Future / CompletableFuture 3.多线程 4.线程池创建多线程 具体流程: 获取需要进行批

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包