线程池创建与注入,以及线程池参数失效
一、MyThreadPool
public class MyThreadPool {/*** 自定义线程名称,方便的出错的时候溯源*/private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNamePrefix("YH-POOL-%d").build();/*** corePoolSize 线程池核心池的大小* maximumPoolSize 线程池中允许的最大线程数量* keepAliveTime 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间* unit keepAliveTime 的时间单位* workQueue 用来储存等待执行任务的队列* threadFactory 创建线程的工厂类* handler 拒绝策略类,当线程池数量达到上线并且workQueue队列长度达到上限时就需要对到来的任务做拒绝处理* 原理:* 有请求时,创建线程执行任务,当线程数量等于corePoolSize时,请求加入阻塞队列里,当队列满了时,接着创建线程,* 线程数等于maximumPoolSize。 当任务处理不过来的时候,线程池开始执行拒绝策略。* 换言之,线程池最多同时并行执行maximumPoolSize的线程,最多处理maximumPoolSize+workQueue.size()的任务。多余的默认采用AbortPolicy会丢弃。* 阻塞队列:* ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。* LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。* PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。* DelayQueue: 一个使用优先级队列实现的无界阻塞队列。* SynchronousQueue: 一个不存储元素的阻塞队列。* LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。* LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。* 拒绝策略:* ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。 (默认)* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务。(重复此过程)* ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。*/private static ExecutorService service = new ThreadPoolExecutor(16,32,10L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(8),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());/*** 获取线程池* @return 线程池*/public static ExecutorService getEs() {return service;}/*** 使用线程池创建线程并异步执行任务* @param r 任务*/public static void newTask(Runnable r) {service.execute(r);}public static void shutdown() {service.shutdown();}}
二、注入
1、懒加载注入。(直接在用到线程池的方法里调用就是,这种就是只有当第一次访问这个方法时才创建线程池)
//定义固定长度的线程池 防止线程过多
ExecutorService executorService = MyThreadPool.getEs();
2、项目启动时就注入(两种方案)
2.1、在类上加注解注入
配置扫描路径(MyThreadPool在这个包下)
2.2、配置注入。
写个配置类,用@Configuration+@Bean 注入spring
这种写法,只不过new的对象是 MyThreadPool
三、线程池参数失效
new ThreadPoolExecutor(
16,
32,
10L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(8),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy()
);
如果第五个参数使用了无界队列,或者没有指定容量限制。那么第2,3,4参数都会失效,线程池会无限的创建线程,最终oom。
线程池创建与注入,以及线程池参数失效相关推荐
- 多线程总结:1.线程的创建于开启 2.线程的状态 3.线程安全
多线程 三高: 高可用 高性能 高并发 thread 类 线程是程序中执行的线程. Java虚拟机允许应用程序同时运行多个执行线程. 多线程: 多任务执行 ...
- java 线程的创建和执行_线程管理(一)线程的创建和运行
声明:本文是< Java 7 Concurrency Cookbook>的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪 线程的创建和运行 ...
- 请详细描述一下线程从创建到死亡的几种状态都有哪些?
请详细描述一下线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象的 star ...
- Linux 线程的创建与同步
Linux 线程的创建与同步 1.线程的定义 2.线程的创建和使用 3.理解线程的并发运行 3.线程同步 3.线程的实现 1.线程的定义 线程:进程内部的一条执行路径.是资源调度和执行的基本单位. 进 ...
- linux c 线程的创建、线程等待、线程终止、线程分离
1. 什么是线程 线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...
- MFC多线程的创建,包括工作线程和用户界面线程
MFC多线程的创建 1.MFC多线程简介 MFC对多线程进行了一层简单的封装,在Visual C++中每个线程都是从CWinThread类继承而来的.每一个应用程序的执行都有一个主线程,这个主线程也是 ...
- linux线程的创建与删除
linux线程的创建与删除 使用linux线程时,编译时需要包含-pthread选项. Linux通用API返回0表示成功,返回-1表示失败,并设置errno以标识错误原因.但Pthreads相关的A ...
- Java 线程详解(一)线程的基础
为了9月份的秋招呢,现在开始进行多线程以及并发相关知识的学习..加油加油 一.一些基本的概念 1.线程和进程 进程:正在运行的程序,是系统进行资源分配的独立单位. 线程:进程的执行路径,调度和执行的单 ...
- java 线程 暂停_如何实现Java线程的暂停和重新启用?
展开全部 JAVA中线程开始有start方法,暂停用sleep(time)方法,线程停止用stop方法,线程等待wait方法,java 中没有线程重启一说,只能说线62616964757a686964 ...
最新文章
- 一杯茶的功夫,掌握Git常用命令(转载)
- mac如何导入python第三方库_mac下python安装第三方库
- 图说数据中心蒸发节能技术
- 佰腾科技:专利大数据的云上裂变之路
- php seaslog安装,浅谈win10下安装php seaslog扩展的方法
- 堡垒之夜安装包删除_堡垒之夜安装不了怎么办_常见安装下载问题解决方法_3DM网游...
- 中国wms仓储管理系统行业发展状况分析?
- 数据挖掘项目:银行信用评分卡建模分析(下篇)
- WiFi Interface 的 name 如何获取到
- 阿里云和腾讯云全方位对比
- 简单动态网站的搭建流程
- Lemmatization VS Stemming
- kubernetes的eviction机制
- 向下兼容性格什么意思_成大事者都有一种高段位能力:向下兼容
- 如何知道您是否准备从Mac切换到Linux
- cocos2d-x教程和项目实例集合
- C++ Reference: Standard C++ Library reference: C Library: cmath: fma
- php soap https 登录 复杂请求 上海资信 金融p2p Error cannot find parameter faultstringFunction ' not found
- PHP开启magic扩展,php.ini中Magic_Quotes_Gpc开关设置
- 【GD32F427开发板试用】5. SPI驱动TFTLCD屏幕