网站首页 > java教程 正文
通过Executors类提供的方法
1、newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程
2、newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待
3、newScheduledThreadPool:创建一个周期性的线程池,支持定时及周期性执行任务
4、newSingleThreadExecutor:创建一个单线程的线程池,可保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
通过ThreadPoolExecutor类自定义
7个参数如下:
(1)corePoolSize:核心线程数,线程池中始终存活的线程数。
(2)maximumPoolSize: 最大线程数,线程池中允许的最大线程数。
(3)keepAliveTime: 存活时间,线程没有任务执行时最多保持多久时间会终止。
(4)unit: 单位,参数keepAliveTime的时间单位,7种可选。
(5)workQueue: 一个阻塞队列,用来存储等待执行的任务,均为线程安全,7种可选。
(6)threadFactory: 线程工厂,主要用来创建线程,默及正常优先级、非守护线程。
(7)handler:拒绝策略,拒绝处理任务时的策略,4种可选,默认为AbortPolicy。
线程池的执行规则:
(1)当线程数小于核心线程数时,创建线程;
(2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
(3)当线程数大于等于核心线程数,且任务队列已满:
- (3.1)若线程数小于最大线程数,创建线程;
- (3.2)若线程数等于最大线程数,抛出异常,拒绝任务;
线程池的优点
1、减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可以执行多个任务;
2、防止因为线程过多消从而耗过多的内存,导致死机;可以根据系统的承受能力,调整线程池中工作线程的数目,(每个线程需要约1MB的内存,线程开的越多,消耗的内存也就越大,最后死机)
线程复用,线程对象被反复使用
核心原理
线程池对Thread进行了封装,并不是每次执行任务都会调用Thread.start()来创建新线程,而是让每个线程去执行一个”循环任务“,在这个循环任务里,不停的检查是否还有任务等待被执行,如果有则直接去执行这个任务,也就是调用任务的run()方法,把run()当作普通方法直接调用,而不是创建一个新线程来执行run()方法,所以线程数量并不增加
拒接策略
1、AbortPolicy:直接抛出异常,阻止线程正常运行
2、CallerRunsPolicy:如果被丢弃的线程任务未关闭,则执行该线程任务
3、DiscardOldestPolicy:移除任务队列中最早的一个线程任务,并尝试提交当前任务
4、DiscardPolicy:丢弃当前的线程任务而不做任何处理
5、自定义拒绝策略:可实现RejectedExecutionHandler接口老实现拒绝策略,并捕获异常来实现自定义拒绝策略
- 上一篇: Java线程池的正确创建方式
- 下一篇: 线程池的7种创建方式,强烈推荐你用它
猜你喜欢
- 2024-11-23 不清楚Java线程池实现原理?那你应该收藏这篇文章!「源码分析」
- 2024-11-23 Java基础——Java多线程(线程的创建方式)
- 2024-11-23 「一文搞懂」Java线程池实现原理
- 2024-11-23 Java线程池
- 2024-11-23 java线程池实现原理以及应用场景说明
- 2024-11-23 快速弄懂Java线程池
- 2024-11-23 java线程池原理浅析
- 2024-11-23 彻底了解线程池的原理——40行从零开始自己写线程池
- 2024-11-23 Java并发编程(8):Executor框架 - 可扩展线程池WorkStealingPool
- 2024-11-23 java中的线程池
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)