面试典中典之线程池的七大参数

这篇具有很好参考价值的文章主要介绍了面试典中典之线程池的七大参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、七大元素解释

 创建 ThreadPoolExecutor 对象时,可以通过参数控制线程池的大小、任务队列、线程空闲时间等

1.corePoolSize(核心线程数):

表示线程池中保持的常驻核心线程数,即使线程处于空闲状态,也不会被回收。核心线程会一直存活,除非设置了 allowCoreThreadTimeOut 参数为 true,允许核心线程在一定时间内空闲时被回收。

2.maximumPoolSize(最大线程数):

表示线程池中允许的最大线程数。当线程池中的线程数达到这个值时,后续的任务会被放入任务队列中等待执行,或者执行拒绝策略,具体取决于任务队列和拒绝策略的配置。

3.keepAliveTime(线程空闲时间):

表示当线程池中的线程数大于核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。超过这个时间,多余的线程会被终止,直到线程数不超过核心线程数。

4.unit(时间单位):

表示线程空闲时间的单位,通常是秒、毫秒等。

5.workQueue(任务队列):

表示用于保存等待执行的任务的队列。线程池会根据核心线程数和任务队列来决定是否创建新的线程。常用的任务队列有 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。

6.threadFactory(线程工厂):

表示创建新线程的工厂类,用于自定义线程的名称、优先级等属性。

7.handler(拒绝策略):

表示线程池无法执行新任务时的处理策略。当线程池的线程数达到最大线程数并且任务队列已满时,会触发拒绝策略。常用的拒绝策略有 ThreadPoolExecutor.AbortPolicy、ThreadPoolExecutor.DiscardPolicy、ThreadPoolExecutor.CallerRunsPolicy 等

package com.ccy.agriculture.test;
import java.util.concurrent.*;
/**
 * 文件名称(File Name):
 * 功能描述(Description):此模块的功能描述与大概流程说明
 * 数据表(Tables):表名
 *
 * @Author wujiahao
 * 日期(Create Date):2023/7/26
 * 修改记录(Revision History):
 */


public class CustomThreadPool {
    public static void main(String[] args) {
        // 1. corePoolSize(核心线程数):5
        // 表示线程池中保持的常驻核心线程数为 5,即使线程处于空闲状态,也不会被回收。
        int corePoolSize = 5;

        // 2. maximumPoolSize(最大线程数):10
        // 表示线程池中允许的最大线程数为 10。当线程池中的线程数达到这个值时,
        // 后续的任务会被放入任务队列中等待执行,或者执行拒绝策略。
        int maximumPoolSize = 10;

        // 3. keepAliveTime(线程空闲时间):60
        // 表示当线程池中的线程数大于核心线程数时,多余的空闲线程在终止前等待新任务的最长时间为 60 秒。
        // 超过这个时间,多余的线程会被终止,直到线程数不超过核心线程数。
        long keepAliveTime = 60;

        // 4. unit(时间单位):TimeUnit.SECONDS
        // 表示线程空闲时间的单位为秒。
        TimeUnit unit = TimeUnit.SECONDS;

        // 5. workQueue(任务队列):LinkedBlockingQueue
        // 表示用于保存等待执行的任务的队列为 LinkedBlockingQueue。
        // LinkedBlockingQueue 是一个无界队列,可以保存无限数量的等待执行任务。
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

        // 6. threadFactory(线程工厂):默认的线程工厂
        // 不对线程工厂进行自定义,使用默认的线程工厂。

        // 7. handler(拒绝策略):ThreadPoolExecutor.AbortPolicy
        // 当线程池的线程数达到最大线程数并且任务队列已满时,采用默认的拒绝策略 AbortPolicy,
        // 即抛出 RejectedExecutionException 异常,拒绝新的任务执行。

        // 创建自定义线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                corePoolSize,              // 核心线程数
                maximumPoolSize,           // 最大线程数
                keepAliveTime,             // 线程空闲时间
                unit,                      // 时间单位
                workQueue                  // 任务队列
        );

        // 提交任务给线程池执行
        for (int i = 1; i <= 20; i++) {
            final int taskNumber = i;
            threadPool.execute(() -> {
                System.out.println("Task " + taskNumber +
                 " is being executed by Thread " + Thread.currentThread().getName());
            });
        }

        // 关闭线程池
        threadPool.shutdown();
    }
}

这里可以打印出每个任务在哪个线程执行,不需要一个一个地等待前面的任务完成才能开始执行,可以并行执行多个任务,从而更好地利用系统资源
面试典中典之线程池的七大参数,多线程,八股文,面试,java,jvm

让主线程在控制台打印,可以发现主线程和线程池里的线程并发执行任务
面试典中典之线程池的七大参数,多线程,八股文,面试,java,jvm

二、CountDownLatch扩展

 现实中很多业务会让子线程完成所有任务后再执行主线程,比如海量Excel表导入,要先分表读取数据再导入,这时要控制主线程要在最后执行任务,于是Java引入了CountDownLatch对象。
面试典中典之线程池的七大参数,多线程,八股文,面试,java,jvm
 CountDownLatch定义一个初始值,主线程调用await()方法阻塞线程,然后每当子线程执行任务时调用countDown()方法,每调用一次计数值减一,当计数值为0时就可以唤醒主线程。

countDownLatch.await(2000,TimeUnit.MILLISECONDS);

 打个比方就是你去餐馆点了20个菜,餐馆有5个厨师帮你做菜,每做一道菜就在订单上划掉对应的菜(减一操作),当所有菜做好了就可以进行上菜这个主线程了(不要跟我杠什么可以边做菜边上菜,我这个餐馆就是要做完所有菜才能上菜)
 await()也可以加参数,以保证主线程必须执行。下面这串代码表示不管子线程任务是否执行完,2000毫秒之后就执行主线程。我遇过子线程拒绝新任务的情况,这样主线程就不会执行了。

友情提示:以上为纯八股文🤡文章来源地址https://www.toymoban.com/news/detail-611927.html

到了这里,关于面试典中典之线程池的七大参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 天去面试的时候,遇到一个问题。我三个任务,ABC,我怎么让A执行完执行B,B执行完执行C 3个并行线程,如何解决。程池的核心运行原理和参数。

    今天去面试的时候,遇到一个问题。我三个任务,ABC,我怎么让A执行完执行B,B执行完执行C 3个并行线程,如何解决。程池的核心运行原理和参数。 1.线程池核心的参数 1.线程核心数- 线程池中始终保持的活动线程数量。 2. 最大线程数 - 线程池能够容纳的最大线程数量。 3.

    2024年02月11日
    浏览(37)
  • Java多线程之线程池的参数和配置

    在Java多线程编程中,线程池是一种常见的技术,用于管理线程的创建和销毁。线程池中的线程可以被重复利用,从而减少了线程的创建和销毁的开销,提高了程序的性能。在Java中,线程池的参数和配置非常重要,不同的参数和配置会影响线程池的性能和行为。 Java线程池的主

    2024年02月16日
    浏览(39)
  • 【Java】线程池七大参数

    线程池中的基本线程数量 线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了 allowCoreThreadTimeOut 。这里的最小线程数量即是 corePoolSize 。 一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这

    2024年02月10日
    浏览(28)
  • 面试题:线程池的底层工作原理

    线程池的几个重要的参数: 1、corePoolSize:线程池的核心线程数(也是默认线程数) 2、maximumPoolSize:最大线程数 3、keepAliveTime:允许的线程最大空闲时间(单位/秒) 线程池内部是通过队列+线程实现的,当我们利用线程池执行任务时: 如果此时线程池中的线程数量小于core

    2024年02月12日
    浏览(56)
  • 并发编程系列---【线程池七大核心参数】

    一、七大核心参数 1.corePoolSize                            核心线程数 2.maximumPoolSize                   最大线程池参数 3.keepAliveTime                         任务结束后,线程存活此处指定时间后才会被释放 4.TimeUnit                                  上一个参数的

    2024年02月13日
    浏览(42)
  • java八股文面试[多线程]——什么是守护线程

     知识来源: 【2023年面试】什么是守护线程_哔哩哔哩_bilibili

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

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

    2024年02月10日
    浏览(47)
  • 【面试系列】八股文之线程篇202306

    union all :包含重复行 union :不包含重复行 shutdown() ,调用shutdown方法,线程池会拒绝接收新的任务,处理中的任务和阻塞队列中的任务会继续处理。 shutdownNow() ,会给workers中所有的线程发送 interrupt 信号,将延迟队列的任务移除并返回。 原理分析 执行任务,尝试添加线程。

    2024年02月12日
    浏览(47)
  • java八股文面试[多线程]——自旋锁

    优点: 1.  自旋锁尽可能的减少线程的阻塞, 这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗  ,这些操作会导致线程发生两次上下文切换! 2. 非自旋锁在获取不到锁的时候会进入阻

    2024年02月10日
    浏览(51)
  • java八股文面试[多线程]——两个线程交替打印1-100之间的数字

    一份代码,两个线程,使用synchronize实现: 重写run()方法,将输出1到100之间整数的代码写到同步方法里。 线程1进入到同步方法,输出一个整数后,阻塞并释放锁。 线程2进入到同步方法,唤醒线程1,输出整数后,阻塞并释放锁。 线程1和线程2重复第3步,直到输出所有的整数

    2024年02月11日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包