Java学习总结(1.1.7) 线程池应用
线程池应用
Q线程是不是越多越好?
1、线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行任务时间就很不合算。
2、java对象占用雄内存,操作系统线程占用系统内存,根揭jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。
线程池原理一概念
1、线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
2、工作线程:线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。
名称描述
接口
Executor 最上层的接口,定义了执行任务的方法 execute
Executorservice 继承了Executor接口,拓展了 Callable、 Future、关闭方法
ScheduledExecutorService 继承了ExecutorService,增加了定时任务相关的方法
实现类
ThreadPoolExecutor 基础、标准的线程池实现
ScheduledThreadPoolExecutor 继承了ThreadPoolExecutor.,实现了ScheduledExecutorService中相关定时任务的方法
---------------------------------------------
线程池AP- Executors工具类
你可以自己实例化线程池,也可以用 Executors创建线程池的工厂类,常用方法如下:
newFixedThreadPool( int nthreads)创建一个固定大小、任务队列容量无界的线程池。核心线程数=最大线程数。
newCachedThreadPool()创建的是一个大小无界的缓冲线程池。它的任务队列是一个同步队列。任务加入到池中,如果池中有空闲线程,则用空闲线程执行,如无则创建新线程执行。池中的线程空闲超过60秒,将被销毁释放。线程数随任务的多少变化。适用于执行耗时较小的异步任务。池的核心线程数=0,最大线程数= nteger. MAX_VALUE。
newsingleThreadExecutor()只有一个线程来执行无界任务队列的单一线程池。该线程池确保任务按加入的顺序一个一个依次执行。当唯一的线程因任务异常中止时,将创建一个新的线程来继续执行后续的任务。与 new Fixed Thread Pool(1)的区别在于,单一线程池的池大小在 newsingle Thread Executor方法中硬编码,不能再改变的。
newScheduledThreadPool( int corepoolsize)能定时执行任务的线程池。该池的核心线程数由参数指定,最大线程数Integer. MAX VALUE
-------------------------------------------------------
线程池API - 方法定义
ExecutorService
ScheduledExecutorService
schedule :
创建并执行一个一次性任务,过了延迟时间就会被执行。
scheduleAtFixedRate :
创建并执行一个周期性任务过了给定的初始延迟时间,会第一次被执行执行过程中发生了异常,那么任务就停止。
一次任务执行时长超过了周期时间,下一次任务会等到该次任务执行结束后,立刻执行,这也是它和 schedulewith Fixed Delay的重要区别。
ScheduleWithFixedDelay:
创建并执行一个周期性任务过了初始延迟时间,第一次被执行,后续以给定的周期时间执行执行过程中发生了异常,那么任务就停止。
一次任务执行时长超过了周期时间,下一次任务会在该次任务执行结束的时间基础上,计算执行延时。对于超过周期的长时间处理任务的不同处理方式,这是它和scheduleatfixed Ratel的重要区别。
-----------------------------------------------------------------------------------
ThreadPoolExecutor
运行逻辑:
最小线程 (满) -> 队列 (满)-> 最大线程(满) -> 拒绝
-------------------------------
Q如何确定合适数量的线程?
计算型任务:Cpu数量的1-2倍
IO型任务:相对比计算型任务,需多一些线程,要根据具体的IO阻塞时长进行考量決定。如 tomcat中默认的最大线程数为:200。也可考虑根据需要在一个最小数量和最大数量间自动增减线程数。
合理利用CPU,达到80%最佳。
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 12.18
- 普通蛋糕做法 05.31
- 玉米烤肠芝士面包做法 05.31
- Mysql安装教程 - 绿色版 06.18
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
- Typora开发版⽆法使⽤解决⽅法 05.04
- 为什么无知者越自信? -- 达克效应 05.10
- 马斯洛需求层次理论 04.29
- 随机综合
- eclipse 快捷键大全_最有用快捷键整理 08.18
- Java学习总结(2.2.1) Netty线程模型 04.20
- Java学习总结(1.1.5) 线程通信 03.18
- Java学习总结(2.1.1) TCP/UDP协议 04.17
- Springboot安装与开始 03.08
- android 一个Activity跳转到另一个Activity,并数值传递的方法 04.28
- [vue]npm启动导入/运行vue的项目 08.05
- Android开发,为什么Android不直接链接mysql数据库 04.12