Java学习总结(1.1.7) 线程池应用

精贴 置顶
1783 0
作者:      发布时间: 2020-03-19 13:55:10

线程池应用


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%最佳。







 


标签:

每日一句

如果你能每天呐喊二十一遍「我用不着为这一点小事而烦恼」,你会发现,你心里有一种不可思议的力量。

标签云

vue
最近综合
情绪巨婴是什么 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