返回顶部
首页 > 资讯 > 精选 >java自带的四种线程池是什么
  • 333
分享到

java自带的四种线程池是什么

2023-06-30 10:06:15 333人浏览 八月长安
摘要

这篇文章主要讲解了“java自带的四种线程池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java自带的四种线程池是什么”吧!java预定义的哪四种线程池?newSingleThrea

这篇文章主要讲解了“java自带的四种线程池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java自带的四种线程池是什么”吧!

java预定义的哪四种线程池?

  • newSingleThreadExexcutor:单线程数的线程池(核心线程数=最大线程数=1)

  • newFixedThreadPool:固定线程数的线程池(核心线程数=最大线程数=自定义)

  • newCacheThreadPool:可缓存的线程池(核心线程数=0,最大线程数=Integer.MAX_VALUE)

  • newScheduledThreadPool:支持定时或周期任务的线程池(核心线程数=自定义,最大线程数=Integer.MAX_VALUE)

四种线程池有什么区别?

上面四种线程池类都继承ThreadPoolExecutor,在创建时都是直接返回new ThreadPoolExecutor(参数),它们的区别是定义的ThreadPoolExecutor(参数)中参数不同,而ThreadPoolExecutor又继承ExecutorService接口类

  • newFixedThreadPool

定义:
xecutorService executorService=Executors.newFixedThreadPool(2);

java自带的四种线程池是什么

缺点:使用了LinkBlockQueue的链表型阻塞队列,当任务的堆积速度大于处理速度时,容易堆积任务而导致OOM内存溢出

  • newSingleThreadExecutor

定义:ExecutorService executorService =Executors.newSingleThreadExecutor();

java自带的四种线程池是什么

上面代码神似new FixedThreadPoop(1),但又有区别,因为外面多了一层FinalizableDelegatedExecutorService,其作用:

java自带的四种线程池是什么

可知,fixedExecutorService的本质是ThreadPoolExecutor,所以fixedExecutorService可以强转成ThreadPoolExecutor,但singleExecutorService与ThreadPoolExecutor无任何关系,所以强转失败,故newSingleThreadExecutor()被创建后,无法再修改其线程池参数,真正地做到single单个线程。

缺点:使用了LinkBlockQueue的链表型阻塞队列,当任务的堆积速度大于处理速度时,容易堆积任务而导致OOM内存溢出

newCacheThreadPool

定义:ExecutorService executorService=Executors.newCacheThreadPool();

java自带的四种线程池是什么

缺点:SynchronousQueue是BlockingQueue的一种实现,它也是一个队列,因为最大线程数为Integer.MAX_VALUE,所有当线程过多时容易OOM内存溢出

ScheduledThreadPool

定义:ExecutorService executorService=Executors.newScheduledThreadPool(2);

源码:public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {        //ScheduledThreadPoolExecutor继承ThreadPoolExecutor        return new ScheduledThreadPoolExecutor(corePoolSize);    }    public ScheduledThreadPoolExecutor(int corePoolSize) {    //ScheduledThreadPoolExecutor继承ThreadPoolExecutor,故super()会调用ThreadPoolExecutor的构造函数初始化并返回一个ThreadPoolExecutor,而ThreadPoolExecutor使实现ExecutorService接口的    //最终ScheduledThreadPoolExecutor也和上面几种线程池一样返回的是ExecutorService接口的实现类ThreadPoolExecutor    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,          new DelayedWorkQueue());}

线程池有哪几个重要参数?

ThreadPoolExecutor构造方法如下:

java自带的四种线程池是什么

java自带的四种线程池是什么

  • keepAliveTime是指当前线程数位于 [核心线程数,最大线程数] 之间的这些非核心线程等待多久空闲时间而没有活干时,就退出线程池;

  • 等待丢列的大小与最大线程数是没有任何关系的,线程创建优先级=核心线程 > 阻塞队列 > 扩容的线程(当前核心线程数小于最大线程数时才能扩容线程)

  • 假如核心线程数5,等待队列长度为3,最大线程数10:当线程数不断在增加时,先创建5个核心线程,核心线程数满了再把线程丢进等待丢列,等待队列满了(3个线程),此时会比较最大线程数(只有等待丢列满了最大线程数才能出场),还可以继续创建2个线程(5+3+2),若线程数超过了最大线程数,则执行拒绝策略;

  • 假如核心线程数5,等待队列长度为3,最大线程数7:当线程数不断在增加时,先创建5个核心线程,核心线程数满了再把线程丢进等待丢列,当等待队列中有2个线程时达到了最大线程数(5+2=7),但是等待丢列还没满所以不用管最大线程数,直到等待丢列满了(3个阻塞线程),此时会比较最大线程数(只有等待丢列满了最大线程数才能出场),此时核心+等待丢列=5+3=8>7=最大线程数,即已经达到最大线程数了,则执行拒绝策略;

  • 如果把等待丢列设置为LinkedBlockingQueue无界丢列,这个丢列是无限大的,就永远不会走到判断最大线程数那一步了

如何自定义线程池

可以使用有界队列,自定义线程创建工厂ThreadFactory和拒绝策略handler来自定义线程池

public class ThreadTest {    public static void main(String[] args) throws InterruptedException, IOException {        int corePoolSize = 2;        int maximumPoolSize = 4;        long keepAliveTime = 10;        TimeUnit unit = TimeUnit.SECONDS;        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);        ThreadFactory threadFactory = new NameTreadFactory();        RejectedExecutionHandler handler = new MyIgnorePolicy();       ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,                workQueue, threadFactory, handler);        executor.prestartAllCoreThreads(); // 预启动所有核心线程                for (int i = 1; i <= 10; i++) {            MyTask task = new MyTask(String.valueOf(i));            executor.execute(task);        }        System.in.read(); //阻塞主线程    }    static class NameTreadFactory implements ThreadFactory {        private final AtomicInteger mThreadNum = new AtomicInteger(1);        @Override        public Thread newThread(Runnable r) {            Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());            System.out.println(t.getName() + " has been created");            return t;        }    }    public static class MyIgnorePolicy implements RejectedExecutionHandler {        @Override        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            doLog(r, e);        }        private void doLog(Runnable r, ThreadPoolExecutor e) {            // 可做日志记录等            System.err.println( r.toString() + " rejected");//          System.out.println("completedTaskCount: " + e.getCompletedTaskCount());        }    }    static class MyTask implements Runnable {        private String name;        public MyTask(String name) {            this.name = name;        }        @Override        public void run() {            try {                System.out.println(this.toString() + " is running!");                Thread.sleep(3000); //让任务执行慢点            } catch (InterruptedException e) {                e.printStackTrace();            }        }        public String getName() {            return name;        }        @Override        public String toString() {            return "MyTask [name=" + name + "]";        }    }}

运行结果:

java自带的四种线程池是什么

其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行

感谢各位的阅读,以上就是“java自带的四种线程池是什么”的内容了,经过本文的学习后,相信大家对java自带的四种线程池是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: java自带的四种线程池是什么

本文链接: https://lsjlt.com/news/328134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java自带的四种线程池是什么
    这篇文章主要讲解了“java自带的四种线程池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java自带的四种线程池是什么”吧!java预定义的哪四种线程池?newSingleThrea...
    99+
    2023-06-30
  • java自带的四种线程池实例详解
    目录java预定义的哪四种线程池?四种线程池有什么区别?线程池有哪几个重要参数?如何自定义线程池总结java预定义的哪四种线程池? newSingleThreadExexcutor:...
    99+
    2024-04-02
  • Python自带的线程池和进程池有什么用
    这篇文章主要介绍“Python自带的线程池和进程池有什么用”,在日常操作中,相信很多人在Python自带的线程池和进程池有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Java线程池的四种拒绝策略详解
    目录预先配置配置线程池。创建线程任务拒绝策略一:AbortPolicy拒绝策略二:CallerRunsPolicy拒绝策略三:DiscardPolicy拒绝策略四:DiscardOl...
    99+
    2024-04-02
  • 什么是java线程池
    使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?今天给大家分享Java四种线程池的使用方法。线程池介绍:线程池是一种多线...
    99+
    2017-06-28
    java入门 java 线程池
  • java线程池是什么
    java的线程池是什么,有哪些类型,作用分别是什么 (推荐学习:java课程)线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处...
    99+
    2016-06-22
    java教程 java
  • Java中四种线程池的使用示例详解
    在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 本文详细的给...
    99+
    2023-05-31
    java 线程池 ava
  • java中什么是线程池
    本篇文章为大家展示了java中什么是线程池,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. ...
    99+
    2023-06-14
  • python线程池的四种好处总结
    1、使用好处 提高性能:由于减去了大量新建终止线程的费用,重用了线程资源; 适用场景:适用于处理大量突发请求或需要大量线程完成任务,但实际任务处理时间短。 防御功能:可以有效避免系统因线程过多而导致系统负载过大而相应...
    99+
    2022-06-02
    python 线程池
  • java线程池的四种创建方式详细分析
    目录前言1. 线程池2. 创建方式前言 在讲述线程池的前提 先补充一下连接池的定义 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用 可以看到其连接池...
    99+
    2024-04-02
  • Springboot自带线程池的实现
    目录一: ThreadPoolTaskExecuto二: ThreadPoolTaskScheduler 三 @Scheduled实现定时任务,注解开启定时任务四:Spri...
    99+
    2023-05-20
    Springboot自带线程池 Springboot自带线程池
  • Springboot自带线程池怎么实现
    本篇文章和大家了解一下Springboot自带线程池怎么实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一: ThreadPoolTaskExecuto1 ThreadPoolTaskExecutor线程池:Threa...
    99+
    2023-07-06
  • 关于python线程池的四种实现方式
    目录python 线程池的四种实现方式线程简述方式1 multiprocessing.dummy Pool()方式2:multiprocessing.pool ThreadPool ...
    99+
    2023-05-16
    python线程池 python线程池实现
  • Java线程池优化的方法是什么
    这篇文章主要介绍“Java线程池优化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程池优化的方法是什么”文章能帮助大家解决问题。升级版线程池的优化新增了4种拒绝策略。分别为:M...
    99+
    2023-06-29
  • Java线程池参数的含义是什么
    这篇文章给大家分享的是有关Java线程池参数的含义是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。从源码中可以看...
    99+
    2023-06-29
  • java线程池实现的方法是什么
    Java中线程池的实现方法是通过使用java.util.concurrent包中的ThreadPoolExecutor类来创建和管理...
    99+
    2023-10-11
    java
  • java线程池创建的方法是什么
    在Java中,线程池可以使用以下两种方法来创建: 使用`Executors`类中的静态方法来创建线程池: ExecutorSer...
    99+
    2023-10-25
    java
  • Go实现线程池的两种方式是什么
    这篇“Go实现线程池的两种方式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go实现线程池的两种方式是什么”文章吧。w...
    99+
    2023-06-30
  • Java的四种引用是什么
    这篇文章将为大家详细讲解有关Java的四种引用是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的四种引用,用到的场景强引用:垃圾回收器不会回收软引用:如果内存...
    99+
    2024-04-02
  • Java线程池拒绝策略是什么
    本篇内容介绍了“Java线程池拒绝策略是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、CallerRunsPolicy(调用者运行策...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作