Android 中线程池的理解

2024-08-22 15:08
文章标签 android 理解 中线 程池

本文主要是介绍Android 中线程池的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android 中线程池的理解

前言

Android的日常开发中会用到线程池的地方也不少见,Android中的线程池也是沿用了Java的Executor的方式。关于这些资料网上能搜罗出一大把。现在突然看了一下源码,感觉灵光一闪呀。在这里把自己的理解记录下来。

以前来说,对于线程池的使用只知道有4中,分别为:FixedThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadExecutor,然而不知道其中的原理。后来翻了一下源码,发现这4中线程池的具体实现都是通过一个方法来实现的:

/*** Creates a new {@code ThreadPoolExecutor} with the given initial* parameters and default thread factory and rejected execution handler.* It may be more convenient to use one of the {@link Executors} factory* methods instead of this general purpose constructor.** @param corePoolSize the number of threads to keep in the pool, even*        if they are idle, unless {@code allowCoreThreadTimeOut} is set* @param maximumPoolSize the maximum number of threads to allow in the*        pool* @param keepAliveTime when the number of threads is greater than*        the core, this is the maximum time that excess idle threads*        will wait for new tasks before terminating.* @param unit the time unit for the {@code keepAliveTime} argument* @param workQueue the queue to use for holding tasks before they are*        executed.  This queue will hold only the {@code Runnable}*        tasks submitted by the {@code execute} method.* @throws IllegalArgumentException if one of the following holds:<br>*         {@code corePoolSize < 0}<br>*         {@code keepAliveTime < 0}<br>*         {@code maximumPoolSize <= 0}<br>*         {@code maximumPoolSize < corePoolSize}* @throws NullPointerException if {@code workQueue} is null*/
public ThreadPoolExecutor(int corePoolSize,int maximunPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)
  • corePoolSize:根据上面注释的解释,这个参数代表核心线程数,这些线程是在线程池保存,即使在闲置的状态下也不会销毁的。除非调用了allowCoreThreadTimeOut(true)方法。

  • maximunPoolSize:这个参数代表的是线程池中最大的线程数,包括和核心线程和普通线程。当活动线程数量达到这个数值后,后续任务会被阻塞

  • keepAliveTime:普通线程在限制状态下的超时时间,超过这个时间之后,线程就会被终止。当allowCoreThreadTimeOut(true)被调用后,这个参数对核心线程也生效

  • unit:这个参数代表keepAliveTime的单位,通常有TimeUnit.MILLSECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分钟)等。

  • workQueue:用来保存那些还没有执行的Runnable对象的队列,只有使用execute方法的对象才会保存在这个队列中。当线程池中的线程数量大于核心线程数的时候,会把线程保存在这里。如果线程池的线程数量没有达到最大值,就开启新的普通线程来执行这些任务。如果这个队列保存的任务数达到了上限,而且没有空闲线程的话,则拒绝执行任务。

  • threadFactory:线程工厂,为线程池提供创建新的线程功能。

JAVA中为我们提供了几个具体的线程池实现类:

FixedThreadPool

通过Executors.newFixedThreadPool()来创建

public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());

}

FixedThreadPool的实现得知,该线程池具有固定的线程数量,当线程处于空闲状态下,都不会被回收,除非线程池关闭了,当线程池的所有线程都在活动状态的时候,新任务会保存在队列中,并且new LinkedBlockingQueue<Runnable>()这个队列是没有大小限制的。由于线程不会被回收,所以这种线程池能够快速的响应任务。

CachedThreadPool

通过Executors.newCachedThreadPool()创建。

public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}

可以看到,这个线程池没有核心线程,但是线程数量最大值为Integer.MAX_VALUE,这意味着能线程池的线程数量差不多可以无限大,当一个新任务来到的时候,就检验是否有闲置的线程,如果有就直接执行,没有就创建一个来执行。闲置线程的超时时间为60秒。超过60秒之后就会被回收。

关于SynchronousQueue上网查询了一下资料,这个对象是一个只有一个元素的队列,只有队列当请求取出的时候才能插入,内部并没有数据缓存空间。我们可以简单理解为这个其实没什么乱用的东西,在这里的场景中只是实现了任务能被马上执行。

通过以上特点,我觉得这个线程池适合用于大量耗时短的任务,并且因为当没有任务的时候,线程池是空的,所以系统资源占用比较少。

ScheduledThreadPool

通过Executors.newScheduledThreadPool()创建

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE,DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,new DelayedWorkQueue());
}

其中 DEFAULT_KEEPALIVE_MILLIS 的值为10L,意味着10毫秒就会回收闲置线程,这个线程池的最大线程数量也没有限制,主要的适用场景可能为定时任务或者固定周期性任务。

SingleThreadExecutor

通过Executors.newSingleThreadExecutor方法来创建。

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory));
}

这个线程池的内部只有一个核心线程,所有的任务都在同一个线程按顺序执行,这些线程就不需要处理线程之间同步的问题了,看具体的适用场景了。

这篇关于Android 中线程池的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096621

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是