学习系列之并发编程(二)

『死磕Java并发编程系列』并发编程工具类之CountDownLatch 《死磕 Java 并发编程》系列连载中,大家可以关注一波: ????????『死磕Java并发编程系列』 01 十张图告诉你多线程那些破事 『死磕Java并发编程系列』 02 面试官:说说什么是Java内存模型? 『死磕Java并发编程系列』 03 面试必问的CAS原理你会了吗? 『死磕Java并发编程系列』 04 面试官:说说Atomic原子类的实现原理? ????????『死磕Java并发编程系列』 05 图解Java中那18 把锁 在日常编码中,Java 并发编程可是少不了,试试下面这些并 阅读详情

线程池

池化技术

程序运行会占用系统资源,资源的不合理利用,会造成资源浪费,程序故障以及一系列内存问题,池化技术能够减少资源对象的创建次数,提高程序的性能,特别是在高并发下这种提高更加明显。比较常见的几种池化技术有:
线程池,连接池,内存池,常量池…
使用池化技术缓存的资源对象有如下共同特点:
1,对象创建时间长;2,对象创建需要大量资源;3,对象创建后可被重复使用。
通俗的讲,池化技术可以理解为:事先准备好一些资源,当有使用者需要使用的时候,可以直接拿去使用,但是在使用后要进行归还。

线程池

线程池的创建:
1.使用Executors创建

public class ThreadPoolTest {
    public static void main(String[] args) {

        //创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
       //创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
        ExecutorService threadPool = Executors.newFixedThreadPool(4);
      //创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 
       ExecutorService threadPool = Executors.newCachedThreadPool();
      //创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。 
      ExecutorService threadPool = Executors.newScheduledThreadPool(2);
        try {
            for (int i = 0; i < 10; i++) {

                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" run ..");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }

    }
}

注:阿里巴巴开发规范中,不允许使用Executors来创建线程池,而是推荐使用ThreadPoolExecutor去创建,查阅资料后,发现Executors各个方法有如下弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
  主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
2)newCachedThreadPool和newScheduledThreadPool:
  主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。

2.使用 ThreadPoolExecutor去创建
查看ThreadPoolExecutor源码,发现有如下构造方法
在这里插入图片描述
以最多参数为例,

public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
                              int maximumPoolSize,//最大核心线程池大小
                              long keepAliveTime,//超时没人调用就释放
                              TimeUnit unit,//超时单位
                              BlockingQueue<Runnable> workQueue,//阻塞队列
                              ThreadFactory threadFactory,//线程工厂,一般不变
                              RejectedExecutionHandler handler//拒绝策略)

参数说明:
corePoolSize:线程池的核心线程数;
maximumPoolSize:线程池的最大线程数;
keepAliveTime:线程池空闲时线程的存活时长;
unit:线程存活时长大单位,结合上个参数使用;
workQueue:存放任务的队列,使用的是阻塞队列;
threadFactory:线程池创建线程的工厂;
handler:在队列(workQueue)和线程池达到最大线程数。

public class ThreadPoolExecutorTest {

    public static void main(String[] args) {


        ExecutorService threadPool = new ThreadPoolExecutor(
                2,5,3,
                TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );

        try{
            for (int i = 0; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" run ..");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }
    }
}

扩展:
1.拒绝策略:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
2.任务缓存队列
即workQueue,它用来存放等待执行的任务。
workQueue的类型为BlockingQueue,通常可以取下面三种类型:
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。

在这里插入图片描述
图片引用:狂神说java
总结:
其实这两种方式在本质上是一种方式,通过查看Executors源码发现其最终都是通过ThreadPoolExecutor类的方式。所以ThreaPoolExecutor是重点。

参考资料:

学习《Java并发编程》目录索引 (持续更新中)      写在前面:此系列为本人学习黑马《Java并发编程》所整理的笔记 ! 不局限于应用层开发, 更加深入理解多线程, 并发编程, 更有利于我们长久发展 ! 学习Java并发编程 阅读详情

相关推荐

光伏储能交直流微电网Matlab/Simulink仿真模型

首先是光伏储能交直流微电网,这个也是我还是之前在硕士期间在做光伏扶贫项目时候搭建的仿真,仿真由光伏、蓄电池及负载组成的独立直流微电网,提出电压和电流分段式协同控制策略。接下来我将主要更新关于光伏、风电、储能微电网系统相关的内容,包括具体建模和控制。

2401_89292556的博客 784

【Go语言学习系列29】并发编程(二):channel基础

深入讲解Go语言channel的核心概念、使用方法与最佳实践,包括缓冲与非缓冲通道、发送接收操作、关闭通道等重要知识点,助您全面掌握Go并发编程的核心机制

GopherTribe的博客 997

IBM AC922 8335-GTW 安装linux,CentOS,ubuntu,RHEL各种坑

AC922

u011970286的专栏 891

Java并发编程学习系列二:集合不安全

概念 Java集合类框架的基本接口有哪些? 总共有两大接口:Collection 和 Map ,一个元素集合,一个是键值对集合; 其中 List 和 Set 接口继承了 Collection 接口,一个是有序元素集合,一个是无序元素集合; 而 ArrayList 和 LinkedList 实现了 List 接口,HashSet 实现了 Set 接口,这几个都比较常用; HashMap 和 HashTable 实现了 Map 接口,并且 HashTable 是线程安全的,但是 HashMap 性能更好; C

Herishwater的博客 314

AutoCAD提示找不到acdb24.dll、AcGe24.dll、AcPal.dll、AcUt.dll怎么办?

在我们安装了AutoCAD 2023版本以后,打开CAD,可能会出现dll文件丢失的情况,如下所示:1、由于找不到acdb24.dll,无法继续执行代码。重新安装程序可能解决此问题。2、由于找不到AcGe24.dll,无法继续执行代码。重新安装程序可能解决此问题。3、由于找不到AcPal.dll,无法继续执行代码。重新安装程序可能解决此问题。4、由于找不到AcUt.dll,无法继续执行代码。重新安装程序可能解决此问题。遇到AutoCAD启动系统错误,由于找不到dll文件该怎么处理呢?

huoxu369的博客 1万+

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

Medlar_CN的博客 9515

深入学习掌握JUC并发编程系列(二) -- 梳理Java线程的创建和状态

深入学习掌握JUC并发编程系列(二) -- 梳理Java线程的创建和状态

snapepotter的博客 431

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 672

【Go语言学习系列31】并发编程(四):sync包

详细介绍Go语言sync包提供的各种同步原语,包括Mutex、RWMutex、WaitGroup等工具的使用方法、最佳实践及常见问题,帮助你有效控制并发程序中的共享资源访问

GopherTribe的博客 1068

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

C# WPS操作PPT,全屏,缩率图,备注,跳转播放

本文介绍了一个使用C#开发的PPT操作工具,主要功能包括检测当前打开的PPT文件、获取选中PPT路径、指定播放PPT、获取PPT页面序号和缩略图、提取备注内容等。文章展示了操作界面效果图,并重点解决了用户手动退出PPT后重新获取路径时报错的问题。核心代码实现了通过WPS API进行PPT文件的打开、全屏播放、页面跳转、获取当前页位置等功能,同时支持生成PPT缩略图预览和备注信息提取。当用户未通过工具按钮打开PPT时,程序会自动初始化PPT信息确保功能正常使用。

遇见--专栏 310

如何学习Java并发编程

2012年我刚转行到互联网,那年夏天我从传统通信行业跳槽到互联网行业。那是我成年后看的第一部国产动画片,可谓惊为天人。里面有所谓的八奇技,其中有一门绝技称为:术之尽头,炁体源流。虽然目前作者还没有揭开谜底,但从定义上来说,炁体源流大概有“追本溯源,回归本质”的含义。为什么扯这些呢?很多人学不好Java并发编程,恰恰是因为没有抓住本质。

smart_an的专栏 1484

华为OD机试真题 新系统2026-04-08 C语言 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 183

我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)

冰河用10张图总结出了这份并发编程最佳学习路线,强烈建议大家收藏!!

冰河的专栏 9800

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Python系列】Python 并发编程概述

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

并发编程系列之并发编程的认识

前言 今天我们开始接触并发编程的讲解,首先我们要知道并发编程的目的是什么?一个目的,为了让程序员运行的更快,但是有一点我们要知道,并不是启动越多的线程就能让程序更大限度的并发执行,在并发编程的开发中,如果希望使用更多的线程来加快程序的运行,一般我们会面临下面几种挑战:上下文切换问题,死锁、以及受硬件和软件资源的限制问题,那么我们一个个来说下吧,让我们开始今天的并发编程之旅吧。 上下文切换 什么是上下文切换? 即使是单核处理器,也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机

吭哧吭哧快乐的小牛码 2万+

蓝牙模块HM-10手册

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

【Go语言学习系列33】并发编程(六):原子操作与内存模型

深入探讨Go语言的原子操作和内存模型,包括sync/atomic包的应用、happens-before关系、内存重排以及并发陷阱的避免方法,帮助你构建高效、正确的并发程序

GopherTribe的博客 1208

Java并发编程面经大全——双非上岸阿里巴巴系列

双非本科,四面成功上岸阿里巴巴,在这里把自己整理的面经分享出来,欢迎大家阅读。 序号 文章名 超链接 1 操作系统面经大全——双非上岸阿里巴巴系列 2021最新版面经——>传送门1 2 计算机网络面经大全——双非上岸阿里巴巴系列 2021最新版面经——>传送门2 3 Java并发编程面经大全——双非上岸阿里巴巴系列 2021最新版面经——>传送门3 4 面试阿里,你必须知道的背景知识——双非上岸阿里巴巴系列 2021最新版面经——>传送门4 如有疏漏

weixin_43899069的博客 3639

并发编程系列——wait原理的讨论(1)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

java_lyvee的专栏 9318

【Go语言学习系列30】并发编程(三):select语句

详解Go语言中select语句的用法、工作原理及实际应用,包括超时处理、非阻塞通信和常见并发模式,掌握这一Go并发编程的关键组件

GopherTribe的博客 1336

【Java并发编程】并发编程大合集

转载请注明出处:http://blog.youkuaiyun.com/ns_code/article/details/17539599       为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章       【Java并发编程】实现多线程的两种方法     【Java并发编程】线程的中断

兰亭风雨的专栏 5万+

Java并发编程最佳实例详解系列

Java并发编程最佳实例详解系列: Java并发编程(一)线程定义、状态和属性 Java并发编程(一)线程定义、状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元。在java语言中,线程有四种状态:运行 、就绪、挂起和结束。 进程是指一段正在执行的程序。而线程有时也被成为轻量级的进程,他是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码...

loveyouluobin的博客 1万+

java 并发编程系列_【原创】Java并发编程系列1:大纲

【原创】Java并发编程系列1:大纲一个人能力当中所蕴藏的潜能,远超过自己想象以外。为什么要学习并发编程随着现今互联网行业的迅猛发展,其业务复杂度、并发量也在不断增加,对程序的要求变得越来越高,传统的线性模型也越来越不适用。 同时,计算机软硬件技术的发展,也为多程序同时执行提供了底层的保证,使得并发编程成为主流。 “需求端”和“供给端”都为并发编程提供了巨大的应用空间,所以并发编程已经成为一项必备...

weixin_39857174的博客 202

学习笔记:Java 并发编程②_管程

本博客内容:共享问题分析;synchroinzed;线程安全分析;Monitor;wait / notify;Park / Unpark;分析线程状态的转换;活跃性;ReentrantLock。

做笔记,记录学习中遇到的问题。 1741

【Go语言学习系列28】并发编程(一):goroutine基础

深入剖析Go语言goroutine的基本概念、工作原理与使用方法,从goroutine与线程的区别到常见并发模式与最佳实践,帮助开发者掌握Go语言并发编程核心技术

GopherTribe的博客 1306
上一篇: java四大函数式接口简要学习
下一篇: 学习系列之并发编程(三)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值