parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池
线程组
线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。
构造函数
ThreadGroup(String name)//默认parent为当前线程组
ThreadGroup(ThreadGroup parent, String name)
具体方法
//评估当前活跃的线程数,包括当前group和子group
//不准确因为有可能刚好有新线程加入或销毁
activeCount()
//返回当前活跃的子线程组
activeGroupCount()
//用于销毁线程组及其所有子组。 线程组必须为空,表示线程组中的所有线程都已停止,否则会抛出异常
//它不能作为线程退出的方法
destroy()
//复制当前线程组包括子组的线程到数组中,如果recurse=false,则不复制子组
enumerate(Thread[] list)
enumerate(Thread[] list, boolean recurse)
//返回当前线程组名字
getName()
//获得父线程组
getParent()
//打断所有线程
interrupt()
//等所有线程运行完成后会自动销毁,不需要手动调用destroy()
setDaemon(boolean daemon)
//标志位判断函数
isDaemon()
isDestroyed()
parentOf(ThreadGroup g)
作用
- 通过ThreadGroup的
activeCount
获取当前活跃的线程 - 通过ThreadGroup的
interrupt
方法中断所有的线程
public class ThreadGroupDemo2 {static class SleepTask implements Runnable {@Overridepublic void run() {try {TimeUnit.HOURS.sleep(1);// 休眠1小时} catch (InterruptedException e) {//ignore}}}public static void main(String[] args) {ThreadGroup threadGroup = new ThreadGroup("group");Thread thread1 = new Thread(threadGroup, new SleepTask(), "thread1");Thread thread2 = new Thread(threadGroup, new SleepTask(), "thread2");//activeCount方法用于返回当前活跃的线程,因为刚创建时2个线程都没有启动因此返回0assert threadGroup.activeCount() == 0;thread1.start();thread2.start();//线程组中的2个线程都启动了,active为2assert threadGroup.activeCount() == 2;threadGroup.interrupt();//中断之后,active为0assert threadGroup.activeCount() == 0;}
}
ThreadGroup_Java并发编程教程_田守枝Java技术博客www.tianshouzhi.com
线程池
线程的创建和销毁需要消耗资源,所以通过线程池,用完的线程可以及时回收供其他程序使用,节约了创建和销毁的浪费。
课程里面这一部分并没有介绍并发包中的线程池知识,第三部分才会教,这里是手写线程池。
线程池的初始化
- 初始化一定数量线程,进入阻塞状态,等待任务。通过线程队列管理
- 启动线程池自身监控线程
任务调度
- 任务放入任务队列,并通知线程开始取任务工作
- 任务队列的放入和取出需要加锁
拒绝策略
- 当任务队列过长时,可以做出选择,抛出异常,直接丢弃,阻塞,临时队列
闲时回收和忙时扩增
- init--初始大小,active--活跃大小,max--最大线程数
- 通过启动线程池的一个监控程序,实时对线程队列进行扩增或缩小
线程关闭
- run状态下,通过标志位改变使线程结束
- block状态下,通过interrupt让线程捕获异常使线程结束
parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池相关推荐
- postgres 支持的线程数_为什么 Java 坚持多线程不选择协程?
先说结论:协程是非常值得学习的概念,它是多任务编程的未来.但是Java全力推进这个事情的动力并不大. 先返回到问题的本源.当我们希望引入协程,我们想解决什么问题.我想不外乎下面几点: 节省资源,轻量, ...
- Java高并发与多线程网络编程
目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...
- 高并发访问请求合并学习笔记
用户请求 -- 网关 -- 微服务 -- db 这样的方式对高并发的请求的线程快速的相应,因为数据库的每秒执行的事务数有限,很容易出现慢查询,此时数据库就成为了第一个瓶颈 为了解决这个问题,有两种策略 ...
- Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
Mysql客户端 lua-resty-mysql是为基于cosocket API的ngx_lua提供的Lua Mysql客户端,经过它能够完成Mysql的操做.默认安装OpenResty时已经自带了该 ...
- tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!
来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...
- springboot tomcat默认线程数_记一次JAVA线程池的错误用法
最近项目一个项目要结项了,但客户要求 TPS 能达到上千,而用我写的代码再怎么弄成只能达到 30 + 的 TPS,然后我又将代码中能缓存的都缓存了,能拆分的也都拆分了,拆分时用的线程池来实现的:其实现 ...
- Java高并发和多线程的面试笔试题——稳拿offer
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- 阿里P8架构师谈:高并发与多线程的关系、区别、高并发的技术方案
什么是高并发? 高并发(High Concurrency)是一种系统运行过程中遇到的一种"短时间内遇到大量操作请求"的情况,主要发生在web系统集中大量访问收到大量请求(例如:12 ...
- 阿里P8架构师谈:高并发与多线程的关系、区别、以及高并发的系统解决方案
原创: 架构师进阶 优知学院 5天前 " 很多只知道高并发,却不知道高并发与多线程的关系,以及真正的高并发应该如何设计技术方案" 01 - 什么是高并发 高并发(High Conc ...
最新文章
- 设计模式(观察者模式)
- notepad++的NppFTP插件远程连接linux操作系统
- 盈利模型的内容都有哪些?
- php 换一换 功能,vue换一换功能原型
- C++中1LL避免强制转换
- 折正方体-------------给你出道题
- html5 websocket与c,打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
- java 数据库连接 释放_JDBC连接数据库和释放连接
- 小程序 canvas旋转文字
- C++ 解决多对一问题
- mybatis中selectOne方法分析
- node文件通过不同的后缀名解析不同的文件类型
- 华为S5700交换机配置 不同vlan 间通信---eNSP
- 微商怎么引流?不懂这些就引不来流量!
- 【python】PLY词法分析实验「编译原理」
- Prometheus原理详解
- 哔哩哔哩(B站)的前端之路
- Windows通过修改注册表设置开机启动程序
- [实验室每日一题][20201124][Zip已知明文攻击]
- SPC控制图中的控制线应该用“3倍标准差“还是用“系数A2、D3、D4“公式来计算?
热门文章
- 图文详解mina框架
- 异常:Get请求提交过来的中文参数乱码
- springboot 配置多个请求服务代理
- Map的value转化为其它类型
- 新版Elemen Plus 国际化 1.0.2-beta.59(包含59)
- mysql2005卸载步骤,二次安装mysql步骤
- beetl 页面标签_05.Beetl标签函数以及定界符、占位符介绍---《Beetl视频课程》
- java 后台和前端的消息提醒_滴滴Java后台3面题目:网络+内存溢出+各种锁+高性能+消息队列...
- Spring Boot————ApplicationListener实现逃课事件监听
- linux 网络io命令详解,Linux下五种网络IO模型详解