java线程池知识整理
参考,欢迎点击原文:https://www.jianshu.com/p/246021d04310(java多线程那点事)
https://blog.csdn.net/fanrenxiang/article/details/79855992(线程池整理,很大篇幅)
科普:
1、Juc (java util concurrent) : java并发包
2、并发编程本质:充分利用cpu资源
池的特点: 线程复用,可以控制最大并发数,管理线程
降低资源消耗,提高响应速度,方便管理
这两天整理和java多线程,随即也看了java的线程池,线程池大致流程如下图

Executors的四种线程池类型:
newFixedThreadPool:核心线程数=最大线程数,无界队列,可能大量请求导致oom
newSingleThreadExector:核心线程数=最大线程数,单线程,无界队列,可能大量请求导致oom(FIFO)
newCachedThreadPool:遇强则强,同步移交队列,没有常驻线程,自动回收,可能大量线程导致oom(适用处理生存期较短的异步任务)
newScheduledThreadPool:周期性检查,延迟执行,可能大量线程导致oom
四种线程池特点:
newFixedThreadPool:固定线程池,超过要排队
newSingleThreadExector:单线程线程池,串型执行
newCachedThreadPool:可缓存线程池,灵活回收,灵活新建
newScheduledThreadPool:定长线程池,周期性执行
线程池里手动创建,ThreadPoolExecutor参数:
- corePoolSize:核心线程数,属常驻线程
- maximumPoolSize:最大线程数
- keepAliveTime:非核心线程空闲被回收时间
- unit:时间单位
- workQueue:保存任务的队列,1无界,2有界,3同步移交
- threadFactory:创建线程的工厂类,也比如guava
- handler:饱和策略
非核心线程: 通过poll拿队列中的任务,会被回收
核心线程: 通过task拿队列中的任务,唤醒其他阻塞线程
可使用的两个类:
Runnable:没有返回值,不能通过throw抛异常,效率更低
Callable:有返回值,能抛异常,new FutureTask(thread)适配类
tip:
- Future.get可以阻塞获得任务返回结果
- new Thread创建的是守护进程 ,ThreadFactory创建的是非守护进程
- ThreadLocal:存线程自身的变量副本
- StringBuffer为啥是线程安全的:因为多个操作都是在一个对象上进行操作的,且这个类里面很多方法都是用synchronized修饰
设置多少个线程:
cpu密集型:和cpu核心数一样的数量
io密集型:长时间io,cpu两倍
中断:
Shutdown:中断所有没有正在执行的线程
ShutdownNow:中断所有线程
唤醒其他等待线程执行
CyclicBarrier :只能唤起一个任务,可重用;
CountDownLatch(倒计时计算器): 协调多个线程之间的同步,或者说起到线程之间的通信,可以唤起多个任务。不可重用
【原理:countDownLatch是个计数器,减到了0,wait就会被唤醒,执行了,如下图】

线程通信方式:
1消息传递,
2共享内存
【 wait/notify/notifyAll、await/signal/signalAll ,阻塞队列 BlockingQueue 】
Wait需要配合synchronized使用
ABA问题: A->B->A,但是cas没有发现变化,可以使用版本号来避免
使用volatile关键字: 多个线程监听一个变量,读取到volatile修饰的变量都是最新的,禁止指令重排序
实践应用: 看lms的LessonJsonTaskHelper类
java线程池知识整理的更多相关文章
- java线程基础知识整理
目录 线程基本概念 1.java实现线程 2.线程的生命周期 3.线程常用的方法 3.1.sleep() 3.2.interrupt方法 3.3.stop方法 4.线程调度 4.1.常见的线程调度模型 ...
- 深入浅出Java线程池:源码篇
前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...
- (转载)JAVA线程池管理
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Java 线程池原理分析
1.简介 线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销.在应用上,线程池可应用在后端相关服务中.比如 Web 服务器,数据库服务器等 ...
- 干货 | 教你如何监控 Java 线程池运行状态
之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...
- 深入浅出JAVA线程池使用原理1
前言: Java中的线程池是并发框架中运用最多的,几乎所有需要异步或并发执行任务的程序都可以使用线程池,线程池主要有三个好处: 1.降低资源消耗:可以重复使用已经创建的线程降低线程创建和销毁带来的消耗 ...
- java线程池和中断总结
目录 java线程池和中断总结 一. 线程池的使用 二. java中断机制 中断的处理 三. 线程间通信机制总结 java线程池和中断总结 本系列文是对自己学习多线程和平时使用过程中的知识梳理,不适合 ...
- Java线程池详解,看这篇就够了!
构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础知识 Execu ...
- java线程池的初探
问题来源 发现学习很多技术都提到了线程池的技术,自己的线程池方面没有仔细研究过,现在看了点东西来这里总结下,最近发现写博客是一个很好的锻炼自己并且将学到的东西更加理解的一个方式. 问题探究 java的 ...
- Java 线程池的原理与实现 (转)
最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知 ...
随机推荐
- 小知识:MySQL修改lower_case_table_names参数
环境:MySQL 5.7.25 起初创建环境时没有要求表名称不区分大小写,后续应用使用提出要设置lower_case_table_names=1的需求,期望表名不再区分大小写. 修改这个参数需要重启实 ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)
第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...
- 2023年多校联训NOIP层测试7+【LGR-149-Div.3】洛谷基础赛 #2 & qw Round -1
普及模拟3 \(T1\) 最大生成树 \(100pts\) 简化题意:给定一个 \(n(1 \le n \le 1 \times 10^5)\) 个点的完全图,给定各点的点权 \(a_i(1 \le ...
- NC24608 [USACO 2011 Ope S]Learning Languages
题目链接 题目 题目描述 Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent i ...
- Linux进程通信 | 管道与FIFO
Linux进程间通信通常使用的方式有很多种,其中比较常用的包括管道(pipe)和 FIFO(命名管道).本文将介绍这两种通信方式的基本概念,并用C语言编写示例代码,来说明如何在两个进程之间使用这些IP ...
- MySQL基础之DCL语句
DCL(Data Control Language)语句:数据控制语句. 用途:控制数据库.表.字段.用户的访问权限和安全级别. 常用关键字:grant.revoke等 一般用于管理数据库和用户的权限 ...
- 玩转 CMS2
玩转 CMS2 上篇研究了样式.请求.evn.mock,感觉对效率的提升没有太明显作用. 比如某个工作需要2天,现在1天可以干完,这就是很大的提升. 提高效率的方法有代码复用.模块化.低代码工具. 目 ...
- JSP使用FileUpload上传文件设置setSizeMax后连接被重置
今天在学习利用JSP+Servlet+FileUpload开发文件上传功能.在设置了上传文件最大限制为10M以后,选择了3M的pdf上传提交后连接被重置了... 我的代码: //设置上传单个文件的大小 ...
- DVWA XSS
XSS Store hign level <?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_P ...
- 糟糕,CPU100%了!!!
前言 cpu使用率100%问题,是一个让人非常头疼的问题.因为出现这类问题的原因千奇百怪,最关键的是它不是必现的,有可能是系统运行了一段时间之后,在突然的某个时间点出现问题. 今天特地把我和同事,之前 ...