线程池三大方法,七大参数,四种拒绝策略
线程和进程:
进程: 一个程序,是执行程序的一次执行过程。
一个进程往往包含若干个线程,线程是cpu调度和执行的单位。
Java默认有2个线程:main、GC
池化技术:
01:程序的运行,本质 :占用系统的资源! 优化资源的使用! =>池化技术02:线程池、连接池、内存池、对象池///......创建、销毁。 十分浪费资源03:池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。
线程池的好处:
01:降低资源的消耗
02:提高响应的速度
03:方便管理
(重点)线程复用、可以控制最大并发数、管理线程
线程池三大方法:
- Executors.newSingleThreadExecutor() 单个线程
- newFixedThreadPool(int nThreads) 创建一个固定的线程池的大小
运行结果:
最高同时有5个线程在执行!
- newCachedThreadPool() 大小可伸缩的缓冲池
package threadPool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Test01 {public static void main(String[] args) {// ExecutorService threadExecutor = Executors.newSingleThreadExecutor();//单线程// ExecutorService threadExecutor1 = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池ExecutorService threadExecutor2 = Executors.newCachedThreadPool();//可以伸缩大小的线程池try {for (int i = 0; i < 10; i++) {//使用了线程池之后,使用线程池来创建线程threadExecutor2.execute(() -> {System.out.println(Thread.currentThread().getName() + "执行!");});}} catch (Exception e) {e.printStackTrace();} finally {//为了确保关闭,放在finally里面threadExecutor2.shutdown();//线程池用完,程序结束,关闭线程池}}
}
运行结果:
七大参数:
******7大参数原码分析******public ThreadPoolExecutor(int corePoolSize, //核心线程池大小int maximumPoolSize, //最大核心线程池大小long keepAliveTime, //超时了没有人调用就会释放TimeUnit unit, //超时单位BlockingQueue<Runnable> workQueue, //阻塞队列ThreadFactory threadFactory, //线程工厂,创建线程的,一般不用动RejectedExecutionHandler handler) { //拒绝策略if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException(); this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}
自定义线程池:
public class Test02 {public static void main(String[] args) {ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(2,5,3,TimeUnit.SECONDS,new LinkedBlockingDeque<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (int i = 0; i < 9; i++) {//使用了线程池之后,使用线程池来创建线程threadPoolExecutor.execute(() -> {System.out.println(Thread.currentThread().getName() + "执行!");});}} catch (Exception e) {e.printStackTrace();} finally {//为了确保关闭,放在finally里面threadPoolExecutor.shutdown();//线程池用完,程序结束,关闭线程池}}
}
当人数超过阻塞队列加最大核心线程池大小时触发拒绝策略,会抛出异常。
四种拒绝策略:
图示理解拒绝策略:
举例,银行共有5个窗口(最大线程数),有常开的两个窗口处理业务(核心线程数);候客区(阻塞队列)有三个位置;当两个常开窗口(核心线程)以及候客区(阻塞队列)的位置都有人后,再来客户会开启另外三个窗口;当5个窗口(最大线程)和候客区(阻塞队列)都有人后,再来客户会启动拒绝策略。当窗口(线程)超过设定时间(超时时间)没有业务办理时(未调用)会关闭窗口(释放线程)。
new ThreadPoolExecutor.AbortPolicy()
(默认拒绝策略)银行满了,还有人进来,不处理这个人的,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy()
哪来的去哪里!
new ThreadPoolExecutor.DiscardPolicy()
队列满了,丢掉任务,不会抛出异常!
new ThreadPoolExecutor.DiscardOldestPolicy()
队列满了,尝试和最早的竞争,也不会抛出异常
线程池三大方法,七大参数,四种拒绝策略相关推荐
- 线程池的四种拒绝策略
一.前言 线程池,相信很多人都有用过,没用过相信的也有学习过.但是,线程池的拒绝策略,相信知道的人会少许多. 二.四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximum ...
- 线程池中的七大参数(三)
线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...
- 关于线程池的五种实现方式,七大参数,四种拒绝策略
一.池化技术之线程池 实现线程池视频讲解,附源码:「链接」 什么是池化技术?简单来说就是优化资源的使用,我准备好了一些资源,有人要用就到我这里拿,用完了就还给我.而一个比较重要的的实现就是线程池.那么 ...
- 线程池ThreadPoolExecutor的七大参数
七个参数的构造方法如下 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUn ...
- C#中方法的参数四种类型(值参数、ref、out、params)详解
看公司程序偶然看到ref引用,于是查找一了番,现整理如下: 1. 值参数 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出参数 (以ou ...
- Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池
以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务. 第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部 ...
- 线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?
为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool = Executors.newFixedThreadPool( ...
- 线程池:4个方法,7个参数,4种拒绝策略
什么是池? 先讲一个例子,有可能可以帮助你理解,觉得无趣的小伙伴可以直接跳过.相信大多数都知道外包公司,甚至很多小伙伴还在外包公司呆过,其实外包公司我觉得也就可以看作是个"池". ...
- 击穿线程池面试题:3大方法,7大参数,4种拒绝策略
前言:多线程知识是Java面试中必考的点.本文详细介绍--线程池.在实际开发过程里,很多IT从业者使用率不高,也只是了解个理论知识,和背诵各种八股文,没有深入理解到脑海里,导致面试完就忘.--码农 = ...
最新文章
- ES6中定义的类和对象
- CentosMySQL5.6安装方法
- ssdt 表结构及hook的一般理解
- Linux资料分享,强势来袭!
- / 卡路里_最大卡路里
- 虚拟运营商人工服务器,四大必想之事:倒闭、价格、网络
- 操作 mysql 不生成日志_详解MySQL的日志
- linux iphone文件,在linux下生成iphone所需要的视频和音频文件的方法总结
- 最好用的mysql密码忘记的解决方法
- bash脚本编程之条件判断、条件测试
- net.java.html.boot.BrowserBuilder
- discuz清空session,导致session保存机制失败,session无法更新与解决
- uiswitch样式_iOS - UISwitch 、UISegmentedControl
- css 纯颜色叠加,CSS颜色叠加
- 8项引导技能在Scrum中的应用
- Difference between Static video and Single image ?静态视频和单张图像的区别
- Torts and Personal Injury
- HDU1302——蜗牛爬井(注意使用float)
- fortify源代码扫描问题分析汇总
- 什么是HashMap
热门文章
- AI在华东金融专场 | 腾讯云核心伙伴进阶营走进上海
- [编程工具]使用NPIO(C#)读取xls,xlsx(Excel)表格
- WEB安全的防御--介绍XSS跨网站脚本[wiki]
- 攻防世界János-the-Ripper
- 7.7 竞赛题目选讲
- Windows操作系统:串口篇
- 安卓ClickableSpan修改超链接样式
- 排序算法10——图解基数排序(次位优先法LSD和主位优先法MSD)
- 很不错的Spring学习笔记
- maven获得dom4j_关于dom4j在maven中的使用