线程池秒懂

【JAVA 多线程】线程池 ThreadPoolExecutor使用详解 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(核心线程数量,最大线程数量,空闲线程最大存活时间,时间单位,任务队列,创建线程工厂,任务的拒绝策略);线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作 线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这 个工作队列里。如果工作队列满了,则进入下个流程。 阅读详情

前言

    工作中很多地方都用到了线程池,不仅可以减少线程不停创建,销毁对资源的消耗,还能极大地提高资源利用率 ,
 今天就线程池做一个详尽介绍

干货

/**
  * seven big param
  * 核心线程数
  * 最大线程数
  * 存活时间(非核心线程空闲)
  * 存活时间单位
  * 存放线程的队列(等待执行任务的一个阻塞对列)
  * 创建线程的工厂类
  * 当请求达到一定值时的一个执行策略
  *   AbortPolicy (默认策略,抛弃新增任务,并给调用线程抛出异常)
  *   DiscardPolicy(抛弃新增任务,不抛异常)
  *   DiscardOldestPolicy(喜新厌旧【把新任务添加到线程池执行,抛弃线程池里面待的最久的任务】)
  *   CallerRunsPolicy(自己处理不了,直接返还调用者)
  */
 public static void main(String[] args) throws InterruptedException {
        int corePoolThread = Runtime.getRuntime().availableProcessors();
        System.out.println("corePoolThread = " + corePoolThread);
        final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolThread, corePoolThread * 2, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(200), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
  
// final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolThread, corePoolThread * 2, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(200),  new CustomizableThreadFactory("functionName-Thread-Pool-"), new ThreadPoolExecutor.CallerRunsPolicy());

// final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolThread, corePoolThread * 2, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(200), myThread->{
                Thread thread = new Thread(myThread);
        thread.setName("业务pool-");
        thread.setUncaughtExceptionHandler((t,e)->{
            System.out.println(t.getName() + t.getId()+ " 在 " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) +" 发生异常,堆栈信息:" + e);
        });
        return thread;
        }, new ThreadPoolExecutor.CallerRunsPolicy());
        CountDownLatch countDownLatch = new CountDownLatch(210);
        for (int i = 0; i < 210; i++) {

            int finalI = i;
            threadPoolExecutor.execute(() -> {
                System.out.println("测试数据-execute = " + finalI + "---"+Thread.currentThread().getName());
                countDownLatch.countDown();
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    threadPoolExecutor.shutdown();
                }
            });
            if(i==209){
                System.out.println("运行中====================>"+threadPoolExecutor.getActiveCount());

            }
        }
        countDownLatch.await();
        System.out.println(threadPoolExecutor.getActiveCount());
        TimeUnit.SECONDS.sleep(4);
        System.out.println(threadPoolExecutor.getActiveCount());
    }

验证一下执行顺序

  1. i < corePoolThread +200 ,没有创建新线程
    2.no new thread

  2. i< num num>corePoolThread +200 有线程创建

  3. create new thread

i< num num>maxpool(corePoolThread * 2) 执行策略开始执行
返回调用者执行

线程池拒绝策略——CallerRunsPolicy 最近在搞线程池,用到了CallerRunsPolicy这个拒绝策略。 为什么选用CallerRunsPolicy? 因为考虑到数据一条都不能丢失,所以选择了CallerRunsPolicy策略。保证数据来了不会丢。天真的幻想着这策略好啊! 经过了一段时间的实战考验,发现了一个问题,数据处理不过来,经常堆积,这样还行能接受。 遇到什么问题? 在从单线程改用多线程后,阻塞队列在高峰期时经常是满的。 阻塞队列经常是满了,于是考虑从处理效率上入手,(同事解决的)优化了程序处理速度和数据库写入效率,缓解了这个问题,线 阅读详情

相关推荐

Java线程池的拒绝策略

拒绝策略被设置为CallerRunsPolicy,即当任务被拒绝时,由提交任务的线程来执行该任务。这是线程池默认的拒绝策略。在这个示例中,我们创建了一个线程池,并设置核心线程数为2,最大线程数为4,使用有界队列(大小为3)。DiscardOldestPolicy:当任务被拒绝时,丢弃队列中最老的一个任务,并尝试再次提交被拒绝的任务。,这意味着当线程池无法处理新的任务时,会丢弃队列中的最早的任务,并尝试将新的任务添加到队列中。,这意味着当线程池无法处理新的任务时,会默默地丢弃被拒绝的任务,不抛出任何异常。

2301_77350672的博客 2905

ThreadPoolExecutor里面4种拒绝策略--CallerRunsPolicy

首先介绍一下ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ...

chikoucha6215的博客 7796

一文秒懂 Java 线程池 ( Thread Pool )

Java 语言的实现中,把 Java 线程一一映射到操作系统级的线程,而后者是操作系统的资源,这意味着,如果开发者毫无节制地创建线程,那么线程资源就会被快速的耗尽。下面的示例中,我们创建了一个 ExecutorService 的实例,提交了一个任务,然后使用返回的 Future 的 get() 方法等待提交的任务完成并返回值。一台电脑,运行起来后,它的 CPU 是固定的,05 年之前,还是单核时代,也就是一次只能运行一个线程,虽然随着时间的推移,现在的 CPU。本章节涉及到很多前几个章节中阐述的知识点。

jysf98746的博客 197

说说ThreadPoolExecutor饱和策略CallerRunsPolicy

之前在文章深入线程池ThreadPoolExecutor中聊到了线程池

懂幸福,爱生活 1万+

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 246

一文秒懂 Java 线程池之 ThreadPoolExecutor

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!因为上一章节篇幅有限,所以我决定把拆分为三篇文章单独介绍。本章节,我们就来看看。

smart_an的专栏 1297

深度学习 load_data_fashion_mnist

pytorch 中报错:PermissionError: [WinError 5] 拒绝访问。: '…/data’ 在学习李沐大神动手学习深度学习卷积神经网络章节中,调用d2l包中load_data_fashion_mnist报错,这可能是***权限***的问题。 batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,batch_size) 我的解决方法是 重新定义一下 load_data_fashi

纸上得来终觉浅,绝知此事要躬行 9148

秒懂 Java 线程池之 ThreadPoolExecutor

因为上一章节篇幅有限,所以我决定把拆分为三篇文章单独介绍。本章节,我们就来看看 ThreadPoolExecutor。

二师兄撒欢之地 474

【AI智能体】Coze 打通MySql实现数据报表展示应用搭建详解

Coze 打通MySql实现数据报表展示应用搭建详解

congge 3857

基于深度学习的树木种类识别

本文介绍了基于深度学习的树木种类识别技术。我们将通过深度学习模型和图像处理技术实现对树木的自动识别与分类。首先,我们将介绍深度学习的基本原理和相关算法。接着,我们将详细说明树木种类识别的数据准备、模型构建和训练过程。最后,我们将给出代码示例,帮助读者深入了解和实践该技术。

一键难忘的博客 2317

04、秒懂 Java 线程池之 ThreadPoolExecutor

因为上一章节篇幅有限,所以我决定把 一文秒懂 Java 线程池 拆分为三篇文章单独介绍。本章节,我们就来看看 ThreadPoolExecutor。

深入Java世界:探索编程之美与技术深度 635

[ 虚拟专用网 ] IPsce 虚拟局域网(安全的IP协议的虚拟专用网)详解(二) --- 安全联盟SA

???? 博主介绍 ????‍???? 博主介绍:大家好,我是_PowerShell,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 ????点赞➕评论➕收藏 == 养成习惯(一键三连)???? ????欢迎关注????一起学习????一起讨论⭐️一起进步????文末有彩蛋 ????作者水平有限,欢迎各位大佬指点,相互学习进步! 目录 ???? 博主介绍 一、什么是安全联盟 二、协商参数两种方式:(手动、IKE) 1. 手动 2.

qq_51577576的博客 2802

一文秒懂java线程池

一文秒懂Java线程池

云梦归遥【qq_45834685】 254

YOLOv11原创改进专栏|原创自研篇|DAA模块手把手添加教程

个人简介:大家好!我是 DAA 注意力机制,堪称深度学习中的“聚光灯”。我的任务是帮助模型聪明地识别关键特征,就像一位经验丰富的侦探,能够在繁杂的数据中找到重要线索。通过结合通道和空间的注意力,我能确保模型把重点放在最有价值的信息上,从而提升识别准确率。简单来说,我就是帮助你的模型变得更加专注、敏锐,让它在一堆数据中轻松找到“宝藏”,为检测精度加分!动态适应性特征提取DAA通过动态生成卷积核来适应输入特征的变化,从而实现针对不同数据的自适应特征提取。

mywhyyds的博客 380

用群辉NAS打造影视墙(Jellyfin篇)

之前的文章提到过,用群辉NAS组建影视播放系统可以采用官方提供的Video Station套件,不过影视信息配比较差,响应速度也欠佳,今天我们就聊聊别的套件。在影音媒体方面,常见的还有Emby、Plex、Jellyfin。本文主讲Jellfin的原因是它胜在免费,而且功能比较齐全,完全够用。详细信息可以参考Jellyfin的官网:https://jellyfin.org/

dgnankai的专栏 7325

秒懂SpringBoot之@Async如何自定义线程池

每个Java程序员都有一颗搞高并发的心,所以线程池几乎也是面试必考题。讲线程池的文章网上也特别多特别好,所以本文只是聊一下如何在SpringBoot中使用线程池。当前由于框架的广泛使用,程序员并发编程的机会其实没有那么多,但是掌握其知识却是基本功。

ShuSheng007的程序人生 3010

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言实现线程池,新手秒懂

其实,无限循环的线程基本不会添加到线程池中,线程池就是为了缓解频繁创建,销毁线程占用大量资源而创建的,而无限循环的线程不存在频繁创建和销毁所以就不需要线程池;添加进线程池的线程线存放在队列中,如果有空闲的执行线程,会被取走执行;如果把无限循环的线程添加到线程池,会一直占用线程池的执行线程,导致这个执行线程不能处理其他任务造成资源浪费;2.如果要求并发性,异步性,那么就需要运用线程,但是为了效率,就需要使用线程池来管理这些线程;初始化线程池信息结构体,创建执行数量的线程用于执行队列中的任务;

qq_39466755的博客 739

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 线程池 钩子,一文秒懂 Java 线程池之 ThreadPoolExecutor

因为上一章节篇幅有限,所以我决定把 一文秒懂 Java 线程池 拆分为三篇文章单独介绍。本章节,我们就来看看 ThreadPoolExecutor 。ThreadPoolExecutorThreadPoolExecutor 是一个可被继承 ( extends ) 的线程池实现,包含了用于微调的许多参数和钩子。我们并不会讨论 ThreadPoolExecutor 类中的所有的参数和钩子,只会讨论几个...

weixin_28728031的博客 279

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

03、秒懂 Java 线程池 ( Thread Pool )

本文我们将讲解 Java 中的线程池 ( Thread Pool ),从 Java 标准库中的线程池的不同实现开始,到 Google 开发的 Guava 库的前世今生。本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的,不然有些知识会一头雾水。Java 语言的实现中,把 Java 线程一一映射到操作系统级的线程,而后者是操作系统的资源,这意味着,如果开发者毫无节制地创建线程,那么线程资源就会被快速的耗尽。

深入Java世界:探索编程之美与技术深度 856

线程池(看图秒懂)

线程池的优势: (1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 (3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 线程池使用的关键参数: corePoolSize(必需):核心线程数。默认情况下,核心线程会一直存活,但是当将 allowCoreThreadTimeout,设置为 true 时,核心线程也会超时

weixin_47257050的博客 375

一文秒懂 Java 线程池 ( Thread Pool ) (上)

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!本文我们将讲解 Java 中的线程池 ( Thread Pool ),从 Java 标准库中的线程池的不同实现开始,到 Google 开发的 Guava 库的前世今生。本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的,不然有些知识会一头雾水。

smart_an的专栏 939

Java 多线程,线程池简单写法【秒懂】

多线程、线程池,三种写法都可以,第三种代码最少。

乾坤鸟的博客 1512

白话方式让你秒懂什么是消费者生产者模式什么是线程池

第一章 线程的等待和通知 第01节 方法引入 Object类中的方法 wait() 让当前线程进入等待状态,直到被通知为止 wait(long) 让当前线程进入等待状态,同时设置时间;直到被通知为止或时间结束 notify() 随机通知一个等待线程 notifyAll() 通知所有的等待线程 注意:等待和通知方法必须是锁对象,否则会抛出IllegalMonitorStateException 第02节 案例代码 /** * 通过锁对象将线程等待,经过5秒通知该线程来执行

asd747571569的博客 597

JDK中多线程之JUC线程池的JDK源码解读配合大神的一起看,秒懂。

一、    “JUC线程池”01之线程池架构 1)  概要 前面分别介绍了"Java多线程基础"、"JUC原子类"和"JUC锁"。本章介绍JUC的最后一部分的内容——线程池。内容包括: 线程池架构图 线程池示例 2)  线程池架构图 线程池的架构图如下: A.  Executor 它是"执行者"接口,它是来执行任务的。准确的说,Executor提供了execute()接口来执行...

MRA__S__的专栏 761
上一篇: idea 插件下载So Easy
下一篇: Mybatis 批量优化及参数讲解
WindwardBird
博客等级 码龄7年 19粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值