Java多线程-ThreadPool线程池-3(五)
除了可以通过ThreadPoolExecutor自定义线程池外,同Stream API中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑用什么队列合适的问题。
Javac除了传统的四大线程池工具:
1、newFixedThreadPool定长线程池
2、newCachedThreadPool缓存线程池
3、newSingleThreadExecutor单线程线程池
4、newScheduledThreadPool任务调度线程池
还包括了Java8新增的newWorkStealingPool抢占式线程池,目前这个用的不多,还是以之前的四大类线程池为主。
一、newFixedThreadPool
newFixedThreadPool定长线程池,顾名思义,就是它的线程池的大小是固定的,好比一个水池只能装10个立方的水量,11个立方肯定就装不下了。在newFixedThreadPool定长线程池中,c=m(也就是corePoolSize = maximumPoolSize),默认为无界队列,用代码来示例:
// 定长线程池
ExecutorService service1 = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
System.out.println("创建线程 " + i);
service1.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service1.shutdown();
可以看到,虽然创建了10个线程,但始终只有3个在工作。定长线程池在实际中用的比较多,尤其是一些可估算工作量的任务时。它的程序流程图是这样的:

二、newCachedThreadPool
newCachedThreadPool缓存线程池不会限制池中的线程数量,可以无限往里增加,直到线程数量超出最大整数范围,一般不会用这种方式,因为可能会因为程序故障而把机器拖垮。代码也很简单:
// 缓存线程池
ExecutorService service2 = Executors.newCachedThreadPool();
for (int i = 0; i < 1_000_000_000; i++) {
System.out.println("创建线程 " + i);
service2.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service2.shutdown();
我希望创造10亿个线程,计算机照单全收。我花了很长时间,它都没有停下来的意思
所以我只好强制让它休息了。

它的程序流程图是这样的:

三、newSingleThreadExecutor
newSingleThreadExecutor单线程线程池是定长线程池的一个特例,它的线程池长度始终为1,也就是c=m=1,它的代码:
// 单线程线程池
ExecutorService service3 = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
System.out.println("创建线程 " + i);
service3.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service3.shutdown();
执行后可以看到,它始终只能创建一个线程。
四、newScheduledThreadPool
最后一个是任务调度线程池,顾名思义,需要执行某些任务调度时可以用到,例如:3个线程每秒执行1次的(仅执行1次):
// 任务调度线程池
ScheduledExecutorService service4 = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
// 延迟1秒后执行,仅执行1次
service4.schedule(() -> System.out.println("当前线程 " + Thread.currentThread().getName()),
1,
TimeUnit.SECONDS);
}
service4.shutdown();
或者3个线程每3秒各执行1次的:
// 任务调度线程池
ScheduledExecutorService service5 = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
// 延迟1秒后执行,每3秒执行1次
service4.scheduleAtFixedRate(() -> System.out.println("当前线程 " + Thread.currentThread().getName()),
1,
3,
TimeUnit.SECONDS);
}
service5.shutdown();
线程池的基本内容其实并不多,主要还是要在日常开发中实际使用,多用多练才能熟能生巧。
Java多线程-ThreadPool线程池-3(五)的更多相关文章
- Java多线程-ThreadPool线程池(三)
开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...
- Java多线程-ThreadPool线程池-2(四)
线程池是个神器,用得好会非常地方便.本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用.但是(凡事总有个但是),还是觉得讲一讲可能跟有助 ...
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- Java 多线程:线程池
Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...
- java多线程:线程池原理、阻塞队列
一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- JAVA多线程(三) 线程池和锁的深度化
github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-servic ...
- JAVA中创建线程池的五种方法及比较
之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java多线程之线程池详解
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
随机推荐
- 使用触发器和C#程序实现数据同步
项目中用到了Quartz,也算是Quartz的一个示例. 源库创建数据同步表SYNC_DATA: CREATE TABLE SYNC_DATA( ID VARCHAR2(36) NOT NULL, T ...
- 【每日一题】37. [JSOI2007]建筑抢修 (优先队列 + 贪心)
补题链接:Here 算法涉及:优先队列 + 贪心 因为每一个都有截止时间,按照截止时间排序下来, 如果修复这个工程的时间+修复这个之前的总时间<=截止时间.那么就是可以在规定的时间内完成. 保证 ...
- jdk(jvm)调式工具
JConsole 可视化工具介绍一. JConsole介绍1.1 JConsole描述Jconsole (Java Monitoring and Management Console),一种基于JMX ...
- RLHF · PbRL | QPA:选择 near on-policy query,加速 policy learning 收敛速度
论文题目:Query-Policy Misalignment in Preference-Based Reinforcement Learning,ICLR 2023 Spotlight(8 6 6) ...
- 根据返回的多层Json来进行创建文件,达到根据阶层创建,然后压缩成压缩包进行下载
临时接到一个需求说让根据按照下面的这个图片的结构来打包下载指定位置下的文件到指定位置! 实现思路: 1.把已经实现的树形结构的代码进行调用,拿到他的数据进行创建对应的文件夹 2.因为结构下方的文件没有 ...
- 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)
这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型.基本实现了计算机毕业设 ...
- npm, yarn和pnpm清理缓存
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- [转帖]深度硬核文:Nginx的301重定向处理过程分析
https://zhuanlan.zhihu.com/p/84539204 本文首发于公众号:js-mindmap 一,序言 "晚上九点,办公室里烟雾缭绕,工作进度依然没有什么进展.王二胖打 ...
- [转帖]SQL SERVER中隐式转换的一些细节浅析
https://www.cnblogs.com/kerrycode/p/5853257.html 其实这是一篇没有技术含量的文章,精通SQL优化的请绕道.这个缘起于在优化一个SQL过程中,同事问了我一 ...
- [转帖]Kafka的Topic配置详解
https://www.jianshu.com/p/c9a54a587f0e 一.Kafka中topic级别配置 配置topic级别参数时,相同(参数)属性topic级别会覆盖全局的,否则默认为全局配 ...