Android线程池的入门

Android线程池基础入门和简单实践以及使用技巧 如果你觉得这些内容对你有帮助,可以扫码领取!!!! 阅读详情

此博客是我通过观看麦子学院的视频进行总结的,视频地址:

http://www.maiziedu.com/course/918-13459/

JAVA线程池分为以下几种
- newCachedThreadPool
- newFixedThreadPool
- newSingleThreadExecutor
- newScheduledThreadPool
- 总结

首先我们先来想一下我们平常都是怎样创建的:

匿名类的创建

new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();

这样来看普通创建是存在弊端的(下面会结合代码说明)

  1. 每次new Thread 新创建对象的性能差
  2. 线程缺乏统一管理,可能无限制的新建线程,相互之间竞争,可能会占用过多的系统资源导致OOM
  3. 缺乏更多的功能,比如定时执行,定期执行,线程中断

线程池的好处
1. 重用存在的线程,减少对象的创建,消亡的开销,性能佳
2. 可有效控制最大并发的线程数,提高系统资源使用率,避免过多竞争,避免堵塞
3. 提供定时执行,定期执行,单线程,并发数控制等功能

下面就是怎么使用线程池

所有的案例我们都是使用for循环创建了10个任务,有的任务是耗时的有的是不耗时的

new Thread

这个就不用过多的解释了。。。。。。

代码:

for(int i=0;i<10;i++){
            final int index=i;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Log.e("TAG","new Thread:"+"\n"+"name:"+Thread.currentThread().
                            getName()+"\n"+"i:"+index);
                }
            }).start();
        }

打印日志:

这里写图片描述  这里写图片描述  这里写图片描述

可以看出每一个Thread的name 都是不一样的,这样可不就创建了很多个对象了吗,造成资源浪费

newCachThreadPoll

简介:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空线程,若无可回收,继续创建新的线程

代码:

 //所有的都是ExecutorService的一个对象
        ExecutorService cacheThreadPoll= Executors.newCachedThreadPool();
        //创建10个子线程的任务
        for (int i=0;i<10;i++){
            //i在下面取不到,赋值给index
            final int index=i;
            //每执行一次任务就休息两秒钟
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            cacheThreadPoll.execute(new Runnable() {
                @Override
                public void run() {
                    Log.e("TAG","cacheThreadPoll"+"\n"+"name:"+Thread.currentThread().
                            getName()+"\n"+"i:"+index);
                }
            });
        }

打印日志:

这里写图片描述  这里写图片描述  这里写图片描述

这些线程的名字都是一样的,也就是说只创建了一个对象,就避免了资源的浪费

那么当第一个任务还没执行完,没有空闲的线程对象可以使用了会怎么办呢,我们就可以模拟一下(把休眠去掉即可)  
这里写图片描述  这里写图片描述  这里写图片描述

可以看出来这个线程池中创建了5个线程对象,有的线程对象被使用了多次,并且i的打印顺序不对,那为什么我们停止休眠操作后会出现这个问题呢

i的执行顺序:

CPU在处理子线程任务的时候是随机的,也是穿插执行的,我们同时并发了10个子线程0123…9,因为没有睡眠,所以这些子线程几乎是同时执行,它在执行的时候会随机执行,并且可能会在1上执行一点然后又去2执行,2还没执行完又回到1执行了,所以就造成了i的打印不是顺序的

线程池开启了5个子线程:

当前1号线程被占用,所以只能再开启2号线程去执行其他任务了,当1号线程执行完它的任务之后,它会看看哪些任务还是没有执行的,再去执行其他的任务,最后2号执行完任务并发现没有别的任务了,2号就被回收了

newFixedThreadPool

简介:创建一个定长线程池,可控制线程最大的并发数,超出线程会在队列中等待
代码:

//定义线程池的大小为3
        ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
        for (int i=0;i<10;i++){
            final int index=i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    Log.e("TAG","fixedThreadPool:"+"\n"+"name:"+Thread.currentThread().
                            getName()+"\n"+"i:"+index);
                }
            });
        }

打印日志:
这里写图片描述  这里写图片描述  这里写图片描述

和上面不同,这里不管有几个任务并发,只会有3个线程对象去执行任务,其他的任务只能等着了~

newSingleThreadExecutor

简介:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO)优先执行

代码:

//创建一个单一线程池
        ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    Log.e("TAG", "singleThreadPool:" + "\n" + "name:" + Thread.currentThread().
                            getName() + "\n" + "i:" + index);
                }
            });
        }

打印日志:

这里写图片描述  这里写图片描述  这里写图片描述

不管我们的任务有多少,我们的线程对象只会开启一个

newScheduledThreadPool

简介:创建一个定长的线程池,支持定时及周期性任务的执行,比如两秒之后想做什么,或者是每两秒想做什么

定时执行:

 //得到当前毫秒数
        Log.e("TAG", "textScheduled start:"+System.currentTimeMillis());
        //创建一个定长的线程池,并且里面的线程对象都是单一的
        ScheduledExecutorService scheduledExecutorService = Executors.
                newSingleThreadScheduledExecutor();
        //定义3秒之后执行什么
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                //三秒钟之后会执行到打印Log这一步
                Log.e("TAG", "delay 3 seconds:"+System.currentTimeMillis());
            }

打印日志:

这里写图片描述

中间是相差三秒钟的,并且这个线程只执行了一次

周期性的执行:

 //周期性执行任务,2秒后执行,每隔3秒执行一次
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            //控制执行次数的变量
            @Override
            public void run() {
                Log.e("TAG", "delay 2 seconds,and execute every 3seconds");
            }
        }, 2, 3, TimeUnit.SECONDS);

打印日志:

这里写图片描述

从textScheduled start 到下面的delay…..的带引中间相差了2s,然后每个delay……之间的打印中间相差了3s而且是一直打印下去

停止周期循环:

scheduledExecutorService.shutdown();

总结

不难看出他们之间的使用是有一些规律的

  1. 创建对象——— Executors.newXXXXExecutor( ) ;创建出一个 ExecutorService 的对象,当然 ScheduledExecutorService 是 newScheduledThreadPool 的对象
  2. 将任务放置到线程池———xxxx.execute,参数传递的是一个Runnable接口(newScheduledThreadPool 例外 )
hook(1)入门篇,android线程池面试题 升职,加薪,出任CEO,迎娶白富美,走上人生巅峰,够不够实用?** ##三. 前置技能 java反射 熟练掌握类Class,方法Method,成员Field的使用方法 源码内部,很多类和方法都是@hide的,外部直接无法访问,所以只能通过反射,去创建源码中的类,方法,或者成员. 阅读安卓源码的能力 hook的切入点都在源码内部,不能阅读源码,不能理清源码逻辑,则不用谈hook. 其实使用 androidStudio来阅读源码有个坑,,有时候会看到源码里面 "一片飘红",看似是有什么东西没. 阅读详情

相关推荐

安卓,线程池的使用 ,封装

安卓,线程池的使用 ,封装

Android 线程池

1.线程 在了解线程池之前,先给大家介绍下线程的概念。 从底层角度来说: 一个线程就是在进程中的一个单一的顺序控制流.。 而单个进程可以拥有多个并发执行的任务,每个任务都好像有自己的CPU一样,而其底层的机制就是切分CPU的时间,也就是CPU将轮流给每个任务分配其占用时间。每个任务都觉得自己在一直占用CPU,而事实上是将CPU时间划分成片段分配给所有的任务。 在多个CPU的环境下,多线程的运作,可以极大的提供程序的运行速度,这就是线程存在的意义。 在Android中,有进程和线程之分: 进程:每个app运行

zenmela2011的专栏 8511

ECU-TEST 快速入门

ECU-TEST 是由位于德国德累斯顿的TraceTronic公司开发的一款用于嵌入式系统测试验证软件工具。自从2003年首次发布ECU-TEST ,该软件成为了汽车ECU开发的标准工具 ,同时也逐步成为了重型机械和工业自动化开发的标准工具 。该软件是起源自于一个控制单元的系统化测试的项目研究,从而为从德累斯顿工业大学脱离出来的TraceTronic公司奠定了基础。ECU-TEST旨在完成测试案例的规范化、评估、求解和归档。得益于该软件包含大量的自动化测试方法使得测试案例的所有必要功能如创建、求解和评估

wangying202的博客 1万+

Android中线程池

阻塞队列常用于生产者消费者场景,生产端负责生产,生产的东西发往消费者端。其中生产者端就是往这个阻塞队列添加元素的线程,消费者端就是从队列中拿出元素的线程。

m0_61130325的博客 3133

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理)

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理) 包对

醉蕤的博客 4375

【FPGA】定点数运算中的位宽优化与截取策略

本文深入探讨了FPGA定点数运算中的核心挑战——数据位宽优化与截取策略。针对定点数在加法、乘法等运算中位宽膨胀的问题,文章详细分析了位宽变化规律,并对比了直接截断、四舍五入和收敛舍入三大截取策略的优缺点及硬件实现方法。通过实战指南与避坑经验,旨在帮助开发者在保证计算精度的同时,高效利用FPGA资源,实现性能与面积的平衡。

weixin_29181861的博客 116

Android开发——Android中常见的4种线程池(保证你能看懂并理解)

0.前言 转载请注明出处:http://blog.youkuaiyun.com/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用,减少创建和销毁线程的性能开销。其次,能控制线程池中的并发数,否则会因为大量的线程争夺CP...

测试0901-1 907

创建可视化机房

(3)窗户位置创建好以后需要对窗户的墙面镂空位置进行修补,具体操作为,选中镂空位置的顶点(这里必须是选择一个平面的顶点,不要跨平面选择),实际操作如下图:选择点以后,鼠标右键,选择【从顶点创建边/面】,或者按F键,随后对其他镂空位置进行相同操作;(2)将【物体模式】修改为【编辑模式】,选中-x对应面的所有顶点,移动顶点位置,其他放小调整按照同理,找到选中对应面的所有顶点,移动位置即可;调整动画事件轴上的线,选中关键帧的时间,调整模型的位置或者旋转角度,具体根据插入关键帧菜单选择的项进行模型的相关调整。

SmileBu丿㦌的博客 2064

Android线程池基础入门和简单实践以及使用技巧,面试必问

正式加入字节跳动,分享一点面试小经验 今天正式入职了字节跳动。工号超吉利,尾数是3个6。然后办公环境也很好,这边一栋楼都是办公区域。公司内部配备各种小零食、饮料,还有免费的咖啡。15楼还有健身房。而且公司包三餐来着。下午三点半左右还会有阿姨推着小车给大家送下午茶。听说入职以后很容易长胖来着。不过如果想要保持身材的话,公司二楼还提供专门的健身餐。周二周四还可以预约专业的按摩服务,有效调理颈椎和腰椎。生活服务得这么贴心,感觉在这里就只需要好好工作就好了吧,哈哈 其实很早就和小伙伴们说要写一篇面试经验的。包括我为

m0_56228922的博客 253

金仓数据库KCM认证考试介绍【2025年4月更新】

金仓数据库认证资深专家KCM认证考试介绍

qq709869231的博客 3227

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 47

安卓开发菜单!Android线程池基础入门和简单实践以及使用技巧,年薪超过80万!

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

128

【原理图PCB专题】Cadence 17.4版本原理图及PCB 模块复用

在我们设计复杂板卡的时候,往往会遇到一部分电路被反复使用的情况。Cadence允许设计者一开始就将复用模块设计好,以后只要直接调用复用模块就可以直接用以设计更复杂的电路板了。这对于大规模集成设计无疑是非常好的选择,它不仅让设计者不必花费时间在相同模块反复设计上,更有利于电路的模块化设计。

一点硬件 2016

安卓最牛教材!Android线程池基础入门和简单实践以及使用技巧,成功拿下大厂offer

一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。 FLutter的优势 (1)在所有的平台下,都可以保持同样UI样式,同样的业务逻辑 大多数跨平台框架中的UI呈现如下图所示: 而Flutter是直接画在画布上: (2)减少开发所需的时间 Flutter的热重载可以高效快速的看到改变,甚至保留应用状态; 官方提供的各种现成的组件(Material和Cupertino)。 (3)快速迭代上线 不需要单独适配 iOS、Androi

fanzhang_vip0723的博客 113

Windows 下 Claude Code 使用全记录:从零到一的保姆级图文教程(持续更新)

本文主要介绍了Windows 下 Claude Code 使用全记录:从零到一的保姆级图文教程,希望能对学习使用 Claude Code 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程(2026年最新教程) 2.1 步骤一 Claude Code 环境准备 2.2 步骤二 配置Claude Code 2.3 步骤三 对话 3. 老版本实战教程 3.1 步骤一 配置Node.js 3.2 步骤二 Claude Code配置 3.3 步骤三 配置Claude Code 3.4 步骤四 对话

weixin_43178406的博客 15万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android线程池基础入门和简单实践以及使用技巧,薪资翻倍

Java相关 无论什么级别的Android从业者,Java作为Android开发基础语言。不管是工作还是面试中,Java都是必考题。如果不懂Java的话,薪酬会非常吃亏(美团尤为重视Java基础) 详细介绍了Java泛型、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法 VS 分区收集算法、GC 垃圾收集器、JAVA IO/NIO 、JVM 类加载机制的各大知识点。 详细知识

weixin_57485542的博客 98

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android线程池基础入门和简单实践以及使用技巧,实战解析

**新技术层出不穷,去年kotlin到如今Flutter,技术迭代,你是否会变得固步自封?**那么看本篇文章帮你解决问题,让你知道怎么样学习,学习那些技术点才能不被时代的迭代快速淘汰! 首先,先说一下百度丶腾讯丶阿里技术岗位的一般面试流程 字节音视频一面凉经 时间:花了70分钟左右 面试过程: 一开始问我的是一位大佬,他先是问了我一些c++的知识,我答不上来,于是,就说谈一些比较基础的问题。(不得不说,面试官非常棒,很好说话,不存在故意刁难的行为) 面试过程基本上还算是顺利吧,并没有遇到冷场的现象。以下.

m0_56259515的博客 247

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android线程池基础入门和简单实践以及使用技巧(1)

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

2401_83703835的博客 763
上一篇: 屏幕适配
下一篇: 计算机组成原理笔记---第一章 计算机系统概论
许菠萝
博客等级 码龄10年 263粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值