• Executors工具类的相关方法


    前言:大家好,我是小威,24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法,方便加深知识印象和复习使用。
    本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
    如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
    小威在此先感谢各位大佬啦~~🤞🤞
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

    🎁如果大佬在准备面试,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    在这里插入图片描述

    🎈通过Executors类创建线程池

    线程池的创建方式有很多种,可以通过Executors工具类创建多种模式的线程池,Executors工具类位于java.util.concurrent.locks包中,接下来解释其中的方法。

    首先将线程池的七个参数标在这里:
    corePoolSize:表示线程池中核心线程的数量;

    maximumPoolSize:表示线程池中最大线程数量;

    keepAliveTime:针对救急线程的存活时间的变量,就是当线程数量超过线程池中的核心数量时,如果没有新的任务被提交,那么核心线程外的救急线程就会保持在keepAliveTime变量值之后被销毁,而不是立即销毁;

    unit:也是针对救急线程,表示keepAliveTime的核心单位;

    workQueue:表示线程池中的阻塞队列,阻塞队列中存储着等待执行的任务;

    threadFactory:表示用来创建线程的线程工厂。创建线程池的时候,默认的线程工厂创建的线程具有相同的优先级,可以为线程起一个好名字;

    handler:表示线程池的拒绝策略。当线程池中的阻塞队列满了的时候,线程数maximumPoolSize也达到了最大值,如果此时再有任务提交到线程池,线程池就会采取策略来拒绝任务的执行。

    在这里插入图片描述

    🎆newCachedThreadPool方法

    调用Executors工具类的newCachedThreadPool方法可以创建一个可缓存的线程池,核心线程数为0,当线程池中的线程数量超过了运行任务所需要的线程数,那么可以回收空闲的线程,默认每60s回收;同时当任务增加的时候,线程池又可以创建新的线程来处理任务。

        public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
        }
        public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>(),
                                          threadFactory);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🎊newFixThreadPool方法

    调用Executors工具类的newFixThreadPool方法可以创建一个固定长度大小的线程池,线程池中的线程都是核心线程,也就是创建的线程池中的线程数量是固定的,能够控制线程池的最大并发数。当向线程池提交任务时,如果线程池中有空闲的线程则会直接执行任务,如果没有空闲线程则会将任务放入阻塞队列中等待,有空闲线程的时候再去执行阻塞队列中的线程。当线程池达到最大线程数时,线程数量会保持不变,一旦某个线程出现异常,线程池会补充一个线程。提交到线程池的任务过多可能会导致内存溢出。

        public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>(),
                                          threadFactory);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    🎍newScheduledThreadPool方法

    调用Executors工具类的newScheduledThreadPool方法可以创建一个可以周期性执行任务的线程池,也能够定时执行任务。

        public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
            return new ScheduledThreadPoolExecutor(corePoolSize);
        }
    
        public static ScheduledExecutorService newScheduledThreadPool(
                int corePoolSize, ThreadFactory threadFactory) {
            return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🎠newSingleThreadExecutor方法

    调用Executors工具类的newSingleThreadExecutor方法可以创建只有一个工作线程的线程池,相当于只有一个线程在工作。能够保证任务按照先进先出的顺序,或者优先级顺序执行任务。就像单线程在串行执行任务一样,但是也有些区别,如果这个唯一的线程出现了异常,线程池会创建一个新的线程来代替它。

       public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>(),
                                        threadFactory));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🎡newSingleThreadScheduledExecutor方法

    调用Executors工具类的newSingleThreadScheduledExecutor方法可以创建只有一个工作线程,并且支持定时,周期性执行任务的线程池。

        public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
            return new DelegatedScheduledExecutorService
                (new ScheduledThreadPoolExecutor(1, threadFactory));
        }
    
    • 1
    • 2
    • 3
    • 4

    🎁newWorkStealingPool方法

    调用Executors工具类的newSingleThreadExecutor方法可以创建一个具有并行级别的线程池,这是jdk 1.8新增的方法,可以为线程池设置并行级别,通过使用多个队列来减少竞争,需要传递一个并行级别的参数。

        public static ExecutorService newWorkStealingPool(int parallelism) {
            return new ForkJoinPool
                (parallelism,
                 ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                 null, true);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    本篇文章就分享到这里了,后续将会分享各种其他关于线程池的知识,感谢大佬认真读完支持咯 ~
    在这里插入图片描述

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
    希望能和诸佬们一起努力,今后进入到心仪的公司
    再次感谢各位小伙伴儿们的支持🤞

    在这里插入图片描述

  • 相关阅读:
    (c语言)五子棋<可修改棋数>
    【BRCM】博通ESDK6.5中添加50210S光口驱动及配置光电自适应的实例
    IDEA项目取消git版本管控并添加svn版本控制
    c++异常
    SSH-KeyGen -认证密钥的生成、管理和转换
    Spring框架(四)Spring的Bean作用域和生命周期
    nacos配置中心使用教程
    72. 编辑距离
    如何在项目运行过程中动态修改邮箱发件人的配置信息
    innodb与myisam的区别
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/127807470