首页 > 其他分享 >线程池的创建方式、七个参数、拒绝策略、阻塞队列、线程池大小设定

线程池的创建方式、七个参数、拒绝策略、阻塞队列、线程池大小设定

时间:2024-03-26 12:01:35浏览次数:19  
标签:最大 队列 创建 阻塞 任务 线程 空闲

线程池的创建方式

1、通过Executors的静态方法可以创建四种类型的线程池。(不推荐)

1)FixedThreadPool 创建一个固定线程数的线程池,线程数量一直保持固定不变,如果任务提交时,没有空闲线程,那就进入任务队列,当有空闲时间时,再执行任务队列中的任务。

2)SingleThreadExecutor 线程池中始终只有一条线程。

3)CachedThreadPool 根据实际情况调整线程的数量,默认初始为0,当有任务提交时,创建线程去执行,当任务执行完毕,默认空闲等待60秒没有新任务提交就被销毁。

4)ScheduledThreadPool 可以在给定的延迟后或者定时运行任务。

PS:上面四种的任务队列长度最大都是Integer.MAX_VALUE,可能造成大量的请求堆积,从而OOM.

2、使用ThreadPoolExecutor()创建线程池。(推荐)

1)七个参数

corePoolSize 核心线程数,任务队列未到达最大容量时,最大可运行线程数。

maximumPoolSize 最大线程数,任务队列达到最大线程数时,最大可运行线程数。

keepALiveTime 存活时间,核心线程数之外的空闲线程存活时间

unit 时间单位,存活时间的时间单位

workQueue 任务队列,暂存等待执行的任务

threadFactory 线程工厂,用来创建线程,一般使用默认的

handler 拒绝策略,当达到最大线程数并且任务队列达到最大容量时,提交的任务会被拒绝,使用相应的拒绝策略。

PS:

线程池默认线程数量是0,当有任务提交时,会创建线程

当线程数达到核心线程数时,还有任务提交,会被暂存在先入先出的任务队列,保证有序性

当任务队列达到最大容量时,继续创建线程,线程达到最大线程数时,新提交的任务同样会进入任务队列

当任务队列再次达到最大容量时,使用拒绝策略

当线程执行完之后,空闲线程超过设置的存活时间,会被回收,直到线程数减少到核心线程数,回收才会停止

2) 拒绝策略

ThreadPoolExecutor.AbortPolicy: 抛出异常拒绝新任务。

ThreadPoolExecutor.CallerRunsPolicy:使用当前主线程执行新任务,慎选。

ThreadPoolExecutor.DiscardPolicy:直接丢弃新任务。

ThreadPoolExecutor.DiscardOldestPolicy:丢弃最早的新任务,也就是任务队列中最早未被处理的任务。

阻塞队列

LinkedBlockingQueue(基于链表的无界队列)

FixedThreadPool和ISingleThreadExecutor使用的是这种队列,队列最大可以达到Integer.MAX_VALUE,导致OOM。

SynchronousQueue(同步队列)

CacheThreadPool 使用的是这种队列,他不存放元素,当有新任务来时,有空闲线程就是用空闲线程,否则就创建线程,线程数最大也可以达到Integer.MAX_VALUE,导致创建大量的线程,导致OOM。

DelayedworkQueue(延迟阻塞队列)

ScheduleThreadPool使用这种线程,内部元素会按照定时时间先后排序,保证每次出队列的执行时间是最早的,内部会自动扩容,最大扩容到Integer.MAX_VALUE,导致OOM。

线程池的大小设定

对于CPU密集型任务,一般设定为N+1,多出来一条用来保证某个线程因为其他原因而暂停,让这一条去占用CPU执行任务,充分利用CPU空闲时间。

对于I/O密集型任务,一般设定为2N,与I/O 交互,需要等待I/O的响应,可以让出CPU,切换线程。

标签:最大,队列,创建,阻塞,任务,线程,空闲
From: https://blog.csdn.net/weixin_45967584/article/details/137037077

相关文章

  • Java面试必问题18:线程安全的集合类和有序的集合类
         精华篇:  极致精简解释有序的集合类包括:TreeMap-基于红黑树实现的有序Map。LinkedHashMap-基于哈希表和双向链表实现的有序Map。TreeSet-基于红黑树实现的有序Set。LinkedHashSet-基于哈希表和双向链表实现的有序Set。示例:有序Map:TreeMap有序Li......
  • 阻塞IO与非阻塞IO
    参考资料:《正点原子Linux驱动教程》等待队列可参考:https://www.cnblogs.com/lethe1203/p/18092974 阻塞IO:阻塞IO简单理解:用户进程通过read函数读取内核相应设备的file_operations.read函数,举个例子:1#include<linux/module.h>2#include<linux/kernel.h>3#includ......
  • 多任务之进程与线程
    多任务进程与线程一、多任务介绍​ 我们生活中有很多事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;用程序来模拟:fromtimeimportsleepdefsing():foriinrange(3):print("正在唱歌...%d"%i)sleep(1)defda......
  • 栈与队列理论基础
    队列是先进先出,栈是先进后出。在Java中,栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。以下是栈的基本操作以及对应的方法:入栈(Push):将元素添加到栈的顶部。对应方法:push(Eitem),将元素 item 推入栈顶。出栈(Pop):从栈的顶部移除并返回元素。对应方法:pop(),移除并返回栈顶元素......
  • 如何实现线程,如何实现线程池
    如何实现线程在Java中实现线程主要有以下三种方式:继承Thread类。定义一个继承自Thread的子类,并重写run方法,该run方法定义了线程要执行的任务。在子类中创建一个Thread对象,并调用其start方法来启动线程。1234实现Runnable接口。定义一个类来实现Runnable接......
  • 卡码java基础课 | 20.排队取奶茶(队列)
    学习内容:队列的基本概念(队头、队尾)和特点(先入先出)双端队列入队、出队、获取队头元素和判断队列是否为空等基本操作ArrayDeque的使用重点归纳:队列,先入先出,FIFO,firstinfirstout。双端队列,同时实现两端的添加和删除操作,即同时有队列和栈的特性。使用方法:导入Queue接口和队......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • Java并发编程:第六章 阻塞队列
    文章目录一、BlockQueue1、特点2、阻塞队列常用方法二、常见的BlockingQueue1、介绍2、ArrayBlockingQueue3、LinkedBlockingQueue4、PriorityBlockingQueue5、LinkedTransferQueue6、SynchrousQueue7、DelayQueue一、BlockQueue1、特点阻塞队列与普通队列(ArrayDe......
  • 实现自定义队列
    publicclassMyQueue{privateint[]array;privateintfront;privateintrear;publicMyQueue(intcapacity){this.array=newint[capacity];}publicvoidenQueue(intelement){if((rear+1)%array.length==front)......
  • 异步秒杀场景下消息队列如何防止消息丢失
    1、生产者写入消息时使用确认机制。生产者向写入消息时,写入成功则消息队列给生产者返回一个成功标识,写入失败,则返回一个失败标识,然后生产者通过失败重试机制重新写入消息。2、将消息队列中的消息持久化到磁盘中3、手动确认机制允许消费者对接收到的每一条消息进行确认,从而确......