展开说说:Android线程池解析

何谓线程池?本人理解是存放和管理线程的一个容器。

线程池存在的意义是什么?

第一:前面博客提到过创建和销毁线程的操作本身是有性能开销的,如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本,使用越频繁就越能节省性能,毕竟省到就是赚到嘛。

第二:方便的管理线程,避免很多线程同时争抢资源引发阻塞。毕竟是人家封装过的,因此有专门的属性参数来控制核心线程数、最大并发数、非核心线程的最大限制时长等。

这篇文章内容计划分两部分:

介绍常用的四种线程池;

线程池种一些常用的属性参数;

Android常用的四种线程池:

//线程池 - 固定线程的
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);//线程池 - 缓存的
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//线程池 -
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
//比较特殊不是以ThreadPool结尾
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

第一种:FixedThreadPool线程数量固定的线程池,它只有核心线程。物以稀为贵,只要线程池不销毁线程就不会被回收。当所有的线程都处于活动状态时,新任务都会处于等待状态,直到有线程空闲出来。所有的都是核心线程因此都是精英,时刻准备着能够更快速地响应外界的请求。

第二种:CachedThreadPool线程数量不固定的线程池,没有核心线程全都是非核心线程,并且最大线程数为Integer.MAX_VALUE,超时时间为60s。当线程池中所有线程都处于活动状态时,线程池会创建新的线程来处理新任务,否则就会复用空闲线程来处理,线程空闲超过60秒会被回收。比较适合执行量大但耗时较少的任务。当所有线程都处于闲置状态时,线程池中的线程都会超时而被停止,这时CacheThreadPool几乎不占任何系统资源。

第三种 ScheduledThreadPool总体线程数量不固定的线程池,核心线程数固定,非核心线程无限大,非核心线程闲置时会被立即回收。ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务。

第四种 SingleThreadExecutor线程数量固定的线程池,只有一个核心线程,并且无超时时间。内部只有一个核心线程,它确保所有的任务都在同一个线程中按顺序执行。用于统一外界所有任务到一个线程,这使得这些任务之间不需要处理线程同步的问题。

线程池种一些常用的属性参数

相信大家都见过一定这样一句话“Android线程池的概念来源于Java的Executor接口”,但实际我们创建线程池直接使用的Executors这个类,但但是线程池的真正实现是ThreadPoolExecutor类。因为看上面四种线程池都是通过调用Executors的四个静态方法来实现的,点进去就会发现它也是创建的ThreadPoolExecutor对象。

通过代码看一下ThreadPoolExecutor类继承关系:

它提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池。

以下是各个参数的具体含义:

①CorePoolSize:线程池的核心线程数

默认情况下,核心线程会一直存活,即使它们处于闲置状态。但是如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,那么核心线程就会存在超时策略,这个时间间隔由keepAliveTime决定,当等待时间超过keepAliveTime时长后,核心线程就会被停止。

②maximumPoolSize:线程池能容纳的最大线程数

当活动线程数达到这个数值后,后续的新任务将会被阻塞。

③keepAliveTime:非核心线程闲置时的超时时长

超过这个时长,非核心线程就会被回收,当线程池的allowCoreThreadTimeOut属性设置为True时,keepAliveTime同样会作用于核心线程。

④unit:keepAliveTime参数的时间单位,是个枚举值秒、毫秒、分钟

⑤workQueue:线程池中的任务队列,通过线程池execute方法提交的Runnable对象会存储在该队列中。该任务队列是BlockingQueue类型,属于阻塞队列,即队列为空时取出任务的操作会被阻塞,只有队列不为空时才能进行取出操作,而在满队列时添加操作会被阻塞。

⑥threadFactory:线程工厂,作用是为线程池提供创建新线程的能力。ThreadFactory是一个接口,它只有一个方法newThread(Runnable r)用来创建线程。

线程池常用方法:

shutDown() 关闭线程池,不影响已经提交的任务会等它完成

shutDownNow() 立刻关闭线程池,并尝试去终止正在执行的线程

allowCoreThreadTimeOut(boolean value) 允许核心线程闲置超时时被回收

execute提交任务

submit 一般情况下我们使用execute来提交任务,但是有时候可能也会用到submit,使用submit的好处是submit有返回值。

粗糙一点来讲execute(runnable)提交任务时会进行以下操作,不是绝对的哈,因为有的压根就没有核心线程、又得有没有非核心线程。我们可以理解一下它的思想就是先核心线程-满了就排队-排队人也太多了就非核心线程-线程总数也超了就抛异常:

①如果线程池中运行的线程数少于核心线程数,就新建一个线程,并执行该任务。

②如果线程池中运行的线程数大于等于核心线程数,则将任务添加到执行队列中排队,等待执行;

③如果连添加执行队列都失败了那估计是真满了,此时新建一个非核心线程,并在该线程执行任务; 这一步得看情况哈,前提是你的线程池可以有非核心线程并且数量未超过最大值

④如果添加执行队列都失败并且当前线程总数已经达到最大线程数,就拒绝这个任务,抛出RejectedExecutionHandler异常。

才疏学浅,如有错误,欢迎指正,多谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017442.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

0基础学PHP有多难?

php作为web端最佳的开发语言,没有华而不实,而是经受住了时间考验,是一门非常值得学习的编程语言。 目前市场上各种网站、管理系统、小程序、APP等,基本都是使用PHP开发的,也侧面反映了PHP的需求以及学习的必要性&…

程序员的神器指南!揭秘软件开发必备工具

在软件开发的广袤海洋中,程序员们像是驾驶着帆船探索未知的航海者。他们面对的不仅仅是代码的挑战,还有项目管理、协作沟通和时间限制的压力。为了应对这些挑战,程序员们需要一系列强大的工具,就像是海中的指南针,帮助…

4.4网安学习第四阶段第四周回顾(个人学习记录使用)

本周重点 ①Linux系统提权 ②Linux权限维持 ③Windows 提权 ④Windows权限维持 ⑤SSRF利用 ⑥内网环境 ⑦内网扫描 ⑧漏洞利用 ⑨内网代理 ⑩获取主机控制权其他方案 ⑩①vuln靶场 ⑩②CS代理与ICMP隧道 本周主要内容 ①Linux系统提权 系统提权是成功入侵系统之…

PHPStudy 下载PHP提示“当前网络不稳定,下载失败”

错误信息 当前网络不稳定,下载失败 获取下载链接失败,请检查网络 假查网络 问题原因 xp.cn服务器的网络不稳定,不是你电脑的网络问题。 解决办法 第一步:下载现成的PHP文件 直接下载现成的文件,放到php目录。 将…

SparkSql介绍

概述 SparkSQL,顾名思义,就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL,而叫Shark,最开始的时候底层代码优化,sql的解析、执行引擎等等完全基于Hive&#xff0c…

避雷!这本7.7分毕业神刊,影响因子狂涨6.179,最新分区上升,却沦为风险期刊!

近日,科睿唯安又连续对多本期刊进行重新评估,多本「JCR Q1」沦为风险期刊。 值得注意的是,又一本中科院顶刊COMPUTERS IN BIOLOGY AND MEDICINE被打上“On Hold”标签,这是目前“黑名单”收入的第三本中科院TOP刊。 此前&#xff…

【Qt QML】ComboBox组件

ComboBox 是一个组合的按钮和弹出列表。它提供了一种以最小的屏幕空间呈现选项列表给用户的方式。ComboBox 使用数据模型填充。数据模型通常是一个 JavaScript 数组、一个 ListModel 或一个整数,但也支持其他类型的数据模型。 下面是一个简单的使用方式。 import …

【Three.js基础学习】15.scroll-based-animation

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 课程要点 结合html等场景 做滚动动画 1.遇到的问题, 在向下滚动时,下方会显白(部分浏览器) 解决:alpha:true …

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境: MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量,通过减少或消除背景噪声,使得语音更清晰,便于听者理解或进一步的语音处理任务,如语音识别和语音通讯。在许多实际应用中,如…

python中numpy库使用

array数组 生成array数组 将list转化为array数组 import numpy as np np.array([1,2],typenp.int32)其中dtype定义的是元素类型,np.int32指32位的整形 如果直接定义dtypeint 默认的是32位整形。 zeors和ones方法 zeros()方法,该方法和ones()类似&a…

网络 IO 模式

同步 IO 与异步 IO 同步 IO 和异步 IO 是关于数据读写方式的两种不同模式。 同步 IO 是指在程序读写数据时,需要等待操作完成后才能继续执行后面的程序。这种模式下,当程序使用阻塞式 IO 时,会一直等待IO操作完成,程序会暂停执行…

HarmonyOS实战开发-如何实现查询当前城市实时天气功能

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式, 数据接口是和风(天气预报), 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是,查询当前城市的实时天气, 目前已实现的功能…

后仿真中的关于延时问题(物理特性角度)

大家都知道,后仿真讲究仿真时序。那么,在网表阶段,接触到后仿延时问题。今天总结一下。 一 延时概念和分类 1.1 分布式延迟(Distributed Delays) 一般用来指定模块内部信号通过逻辑单元或者线网耗费的时间。 1.2 模…

Python运维-日志记录、FTP、邮件提醒

本章目录如下: 五、日志记录 5.1、日志模块简介 5.2、logging模块的配置与使用 六、搭建FTP服务器与客户端 6.1、FTP服务器模式 6.2、搭建服务器 6.3、编写FTP客户端程序 七、邮件提醒 7.1、发送邮件 7.2、接收邮件 7.3、实例:将报警信息实时…

一、Redis五种常用数据类型

Redis优势: 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用,3种高级 3、原子—redis的所有单个操作都是原子性,即要么成功,要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点: 1、支持…

Vscode 实现代码跳转功能

随笔 目录 1. 安装Python 2. 安装Pylance 3. 选择解释器 1. 安装Python 2. 安装Pylance 3. 选择解释器 到此即可实现跳转功能

鸿蒙开发接口Ability框架:【@ohos.application.missionManager (missionManager)】

missionManager missionManager模块提供系统任务管理能力,包括对系统任务执行锁定、解锁、清理、切换到前台等操作。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 impo…

W801学习笔记二十二:英语背单词学习应用——下

续上篇: W801学习笔记二十一:英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》,所以用户交互的逻辑和唐诗是一样的。所以,我们抽一个基类&a…

关于2024年东北教育装备展示会(沈阳)参展通知

2024年东北教育装备展示会 邀请函 数字赋能新时代 共创教育新未来 时间:2024年6月28-30日 地点:沈阳国际展览中心(沈阳市苏家屯-会展路9号) 展览面积:30000平方米 参展商数:260家 预计观众&#xff1…

SpringBoot+Vue+Element-UI实现医患档案管理系统

目录 前言介绍 系统展示 管理员页面 患者管理 诊疗信息管理 病历信息管理 处方信息管理 患者页面 医生页面 部分核心代码 病历信息 上传文件 数据库配置 前言介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技…