Java线程池基础介绍

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

一、线程池的优点

  1、线程池能够复用已经创建了的线程来执行任务,从而降低了频繁创建和销毁线程所带来的资源消耗;

  2、任务创建完成时,不必等待线程的创建,能够立即执行,提高了任务响应的速度。

 

二、创建线程池的七大核心参数

  1、corePoorSize 核心线程数

     线程池中长期存活的线程数量。一般情况下,当线程处于空闲状态时也不会被销毁。

  2、maximumPoorSize 最大线程数

     线程池中允许创建的最大线程数量。当线程池队列满后,能够创建的最大线程数量(核心线程总数量 + 非核心线程总数量)。

  3、keepAliveTime 存活时间

     非核心线程的最大空闲时间。当非核心线程处于空闲状态的时长到达这个时间,就会被销毁。

  4、TimeUnit 时间单位

     存活时间的时间单位。

  5、workQueue 线程池工作队列

     存放工作任务的阻塞队列。当有任务被提交时,若没有线程能够处理,该任务就会被放到队尾,等待线程执行。

  6、threadFactory 线程工厂

     创建一个新的线程时,用到的线程工程。可以用来设置线程名等线程参数。

  7、handler 拒绝策略

     当线程池中的工作线程数量达到了最大线程数量,并且工作队列也容量也满了,此时有任务提交进来时,需要做的处理。

 

三、线程池的执行流程

Java线程池基础介绍

 如图,线程池的执行策略可以分为三个步骤:

  1、当任务提交时,若此时的工作线程数小于核心线程数,则会创建一个线程来执行任务;

  2、当核心线程数已满时,如果此时阻塞队列没有满,则将任务放入到阻塞队列中,等待线程执行;

  3、若核心线程数和阻塞队列都已满时,会去判断当前线程数是否达到最大线程数,没有达到就会创建一个非核心线程来执行任务,达到就执行拒绝策略。

 

四、常用的四种工作队列

  1、ArrayBlockingQueue 基于数组的有界阻塞队列

    当核心线程数已满,会将新的任务放到队列当中,并按照FIFO的顺序等待线程调度。若队列中的任务达到给定的数值,则会启动新的线程去执行任务,若当前线程数量到达最大线程数量,则拒绝执行任务。

  2、LinkedBlockingQuene 基于链表的无界阻塞队列

    也是按照FIFO的,容量为Integer类型的最大值,所以近似于无界。所以maxPoolSize此时就是无效的,因为队列无界,能够不断添加任务,导致不会去创建非核心线程,线程数量最多等于核心线程数量,达不到最大线程数量。

  3、SynchronousQuene 不缓存任务的阻塞队列

    相当于没有队列,当当前线程数达到corePoolSize时,直接创建非核心线程执行任务,当当前线程数到达maxPoolSize后,则拒绝任务。

  4、PriorityBlockingQueue 具有优先级的无界阻塞队列

    默认情况下,元素采用自然顺序升序排列,也可以自定义类,然后实现compareTo()方法来指定元素排序规则。

 

五、常用的四种拒绝策略

  1、AbortPolicy

    中止策略,直接抛出 RejectedExecutionException 错误。线程池默认使用的策略。

    编写一个简单的执行deno:

public static void main(String[] args) {
        // 创建一个线程池
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 3L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.AbortPolicy() );

        for (int i = 0; i < 100; i++) {
            int finalI = i;
            poolExecutor.execute(() -> {
                try {
                    Thread.sleep(1000);
                    System.out.println("[" + Thread.currentThread().getName() + "]:" + finalI + "同学完成");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        poolExecutor.shutdown();
    }

     执行结果:达到最大线程数后,直接抛出错误

Java线程池基础介绍

 

  2、CallerRunsPolicy 

    调用者执行策略,将任务返回给提交该任务的线程执行。

    执行demo不变,将执行策略换为CallerRunsPolicy,运行结果:

Java线程池基础介绍

     可见,因为我们的main线程提交任务给线程池后,线程池队列及线程数量都已满,便将执行的任务返回给main线程,由main线程执行。

  3、DiscardPolicy

    丢弃策略,将该任务丢弃,且不抛出异常。

    执行demo不变,将执行策略换为DiscardPolicy,运行结果:

Java线程池基础介绍

     达到最大线程数后,不执行提交的任务。

  4、DiscardOldestPolicy

    丢弃最老的策略,丢弃队列最前面的任务。

    执行demo不变,将执行策略换为DiscardOldestPolicy,运行结果:

Java线程池基础介绍

     0~5号任务执行过程中,不断有新的任务提交,最后执行到了第99号任务,因为前面的不断被丢弃,99最后被放入队列并被线程执行。文章来源地址https://www.toymoban.com/news/detail-515745.html

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

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

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

相关文章

  • 多线程的优点与缺点分析

    多线程具有以下几个优点: 提高系统性能:多线程可以将任务分解为多个子任务,并同时执行这些子任务。通过利用多核处理器的并行能力,可以提高系统的整体性能和响应速度。多线程还可以充分利用闲置CPU资源,提高系统的利用率。 提高程序的吞吐量:多线程可以在一

    2024年02月06日
    浏览(6)
  • 多线程的优点是什么?如何创建和启动一个线程?线程的状态有哪些?什么是线程安全?

    多线程的优点包括: 提高程序的执行效率:多线程可以同时执行多个任务,充分利用CPU资源,提高程序的整体执行效率。 提高系统的响应速度:多线程可以将耗时的任务放在后台执行,使得用户界面保持流畅,提高系统的响应速度。 提高系统的可靠性:多线程可以将任务分

    2024年02月15日
    浏览(10)
  • 操作系统-线程复用

    操作系统执行线程复用的过程涉及到线程调度和管理。 线程复用是指操作系统能够有效地重用现有的线程来执行新的任务,而不必每次都创建新线程。 这有助于减少线程创建和销毁的开销,提高系统性能。下面是操作系统如何执行线程复用的关键步骤: 线程池管理 :操作系

    2024年02月09日
    浏览(7)
  • YOLOX优点介绍与解析,详细易懂。

    YOLOX优点介绍与解析,详细易懂。

    优点1:主干网络(CSPDarknet)加入 Fcous结构 主干网络加入 Fcous结构 ,将图片宽高信息缩小,减小参数量,提升网络计算速度 Fcous结构: 将输入的图片先经过Fcos结构对图片进行每隔一个像素取出一个值,得到四个特征层,然后再进行concat。从而图片宽高的信息缩小,通道数增加

    2023年04月11日
    浏览(117)
  • 【高并发服务器 02】——线程池与IO多路复用

    线程池的好处 :所有的池都是为了事先把资源准备好,在后续用的时候可以更加方便的拿到这个资源—— 不用去申请、释放资源 什么时候用线程池 ? IO事务并发较高 :人在杭州,但是数据库在北京,想要查询数据库,需要通过互联网建立TCP三次握手,频繁地创建和销毁线

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

    Java中线程池的使用及原理(附带线程池拒绝策略介绍)

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

    2024年04月17日
    浏览(12)
  • FFmpeg: 自实现ijkplayer播放器--07解复用线程设计

    解复用 解复用,读取视频文件,生成数据包(packet),同时,实现数据包队列,存储数据包,用来解码生成数据帧(frame) 解复用线程 read_thread : 创建上下文结构体: avformat_alloc_context 打开文件 avformat_open_input 获取流信息 avformat_find_stream_info 区分视频流和音频流 av_find_best_st

    2024年04月17日
    浏览(4)
  • CountDownLatch介绍和使用【Java多线程必备】

    CountDownLatch介绍和使用【Java多线程必备】

    点击   Mr.绵羊的知识星球  解锁更多优质文章。 目录 一、介绍 二、特性 三、实现原理 四、适用场景 五、注意事项 六、实际应用     CountDownLatch 是 Java 中的一个并发工具类,用于协调多个线程之间的同步。其作用是让某一个线程等待多个线程的操作完成之后再执行。它可

    2024年02月05日
    浏览(10)
  • Java进程线程介绍创建和执行销毁并理解线程安全和线程池 Native Method

    Java进程线程介绍创建和执行销毁并理解线程安全和线程池 Native Method

    进程和线程都是一个控制流程。 一个进程通常对应于一个程序。 一个程序可以由多个不同的线程构成。 一个进程就是一个应用程序 一个应用程序面对多个用户则多个进程 一个进程则多个线程 多个线程共享资源且携带数据操作 多进程资源隔离 多线程的核心在于多个代码块

    2024年02月02日
    浏览(18)
  • TCP/IP协议优点&体系结构介绍

    T C P / I P是一个稳定的、构造优良的、富有竞争性的协议。 T C P和I P是两个独立且紧密结合的协议,负责管理和引导数据报文在I n t e r n e t上的传输。二者使用专门的报文头定义每个报文的内容。T C P负责和远程主机的连接。而I P负责寻址,使报文被送到其该去的地方。 TCP/

    2024年02月05日
    浏览(7)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包