Android 多线程应用

article/2025/9/15 7:17:48

传统线程的弊端

1.重复创建线程对象,性能差;
2.线程缺乏统一管理,可能会无限制创建新的线程,线程之间存在CPU资源竞争,导致CPU占用过高,或者发生OOM;
3.缺乏功能,例如定时。

线程池的好处

1.重用已存在的线程,减少对象的创建、销毁,性能佳
2.有效控制最大并发线程,提高资源使用率,避免过多资源竞争,避免堵塞;
3.提供定时执行、定期执行、单线程、并发控制等功能;

线程池的使用

1. newCacheThreadPoll (缓存线程池)

可以灵活回收无任务的线程,如果没有线程回收,则创建新的线程,实例如下

ExecutorService cacheThreadPoll = Executors.newCachedThreadPool();  //创建一个缓存线程池for (int i = 0; i < 20; i++) {final int index = i;//execute开启一个线程任务cacheThreadPoll.execute(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行任务 :" + index);}});}

运行代码结果如下:
在这里插入图片描述

分析log: 我们发现在20次线程任务中,实际被创建的线程只有12个,说明其中有一部分线程被复用了,为了更直观明显体验线程复用,对代码稍作修改

private void cacheThread() {ExecutorService cacheThreadPoll = Executors.newCachedThreadPool();  //创建一个缓存线程池for (int i = 0; i < 20; i++) {final int index = i;//execute开启一个线程任务cacheThreadPoll.execute(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行任务 :" + index);}});try {Thread.sleep(2000);  //每次睡眠2s,直观看出线程复用效果} catch (InterruptedException e) {e.printStackTrace();}}}

运行结果如下:
在这里插入图片描述
这个时候观察log,发现20个线程任务,由统一的一个线程复用完成。

2. newFixedThreadPoll (定长线程池)

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

 private void fixedThread() {ExecutorService fixedThreadPoll = Executors.newFixedThreadPool(4);  //创建一个缓存线程池for (int i = 0; i < 20; i++) {final int index = i;//execute开启一个线程任务fixedThreadPoll.execute(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行任务 :" + index);try {Thread.sleep(1000);  //每次睡眠2s,直观看出线程复用效果} catch (InterruptedException e) {e.printStackTrace();}}});}}

运行结果如下:
在这里插入图片描述
发现线程每次并发4个任务

3. newSingleThreadEcutor (单例程池)

只会用唯一的一个工作线程去执行任务,保证所有任务按照指定顺序去执行。

ExecutorService singleThreadPoll = Executors.newSingleThreadExecutor();  //创建一个缓存线程池for (int i = 0; i < 20; i++) {final int index = i;//execute开启一个线程任务singleThreadPoll.execute(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行任务 :" + index);}});}

4. newScheduledThreadPool (定长线程池,支持定时,周期)

 //创建一个缓存线程池,单一的,可以创建多个//第一种用法,延迟3秒执行ScheduledExecutorService schThreadPoll = Executors.newSingleThreadScheduledExecutor();Log.d(TAG,  "开始执行3s任务 :");//定时3s后执行schThreadPoll.schedule(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行3s任务 :");}}, 3, TimeUnit.SECONDS);//第二种,周期性任务。4s后执行,每隔3s执行一次schThreadPoll.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Log.d(TAG,  Thread.currentThread().getName() + "  执行3s任务 :");}},4, 3, TimeUnit.SECONDS);schThreadPoll.shutdown(); // 停止周期任务

http://chatgpt.dhexx.cn/article/q9ULLy8t.shtml

相关文章

android多线程讲解与实例

本期的多线程主题与Android相关&#xff0c;侧重讲解在Android中如何用好多线程&#xff0c;需要你有Java的多线程基础。 首先我们思考几个问题&#xff0c;在Android应用中为什么要用多线程?为了解决哪些问题&#xff1f;或者为了实现哪些功能&#xff1f;有哪些好处&#xf…

Android多线程并发的优化

前言 在日常开发中&#xff0c;多线程无数不在&#xff0c;尤其是android开发&#xff0c;看似业务代码没有调用多线程&#xff0c;实际上也在使用多线程&#xff0c;比如GC线程还有运行在子线程的网络请求。而在使用多线程的时候&#xff0c;不可避免的就需要做好并发安全&am…

Android多线程(Handler篇)

【齐天的博客】转载请注明出处&#xff08;万分感谢&#xff01;&#xff09;&#xff1a; https://blog.csdn.net/qijinglai/article/details/80685226 关联文章: Android多线程(Handler篇) Android多线程(AsyncTask篇) Android多线程(HandlerThread篇) Android多线程(Intent…

Android 多线程实现方式

该原创文章首发于微信公众号“字节流动” Android 多线程实现方式 通常来说&#xff0c;一个应用至少有一个进程&#xff0c;而一个进程至少有一个线程。 线程是 CPU 调度的基本单位&#xff0c;进程是系统资源分配的基本单位。 进程独享内存资源&#xff0c;一个进程可以看…

Java多线程,Android多线程

目录 一、线程的概念 二、线程创建的方式及特点 三、线程创建方式 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口&#xff08;我觉得了解即可&#xff09; 4、AsyncTask异步任务&#xff08;被弃用&#xff09; 5、AsyncTask替代方案 四、线程的基础操作 …

Android多线程开发详解

一、基本概念 1、时间片轮转机制 如果在时间片结束时进程还在运行&#xff0c;则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结来,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。 每个进程被分…

Android开发中四种常用的多线程实现方式

前言 一般来说&#xff0c;一个应用至少有一个进程&#xff0c;一个进程至少有一个线程。线程是CPU调度的基本单位&#xff0c;进程是系统资源分配的基本单位。 进程拥有独占的内存资源&#xff0c;一个进程可以看作一个JVM一个进程崩溃后&#xff0c;一般不会影响保护模式下…

Android 中的多线程简介

一、概念讲解 进程&#xff1a;是程序运行过程中系统进行资源分配和调度的一个独立单位&#xff0c;使多个程序可 并发执行&#xff0c;以提高系统的资源利用率和吞吐量。 线程&#xff1a;一个基本的CPU执行单元 & 程序执行流的最小单元。 线程自己不拥有系统资源&#…

anchor free和anchor based的区别

链接&#xff1a;https://www.zhihu.com/question/356551927/answer/926659692 1.目标检测算法一般可分为anchor-based、anchor-free、两者融合类&#xff0c;区别就在于有没有利用anchor提取候选目标框。A. anchor-based类算法代表是fasterRCNN、SSD、YoloV2/V3等fasterRCNN-…

Anchor based and Anchor free(无锚VS有锚)【总结】

anchor-free 和 anchor-based 区别 anchor-free和anchor-based是两种不同的目标检测方法&#xff0c;区别在于是否使用预定义的anchor框来匹配真实的目标框。 anchor-based方法使用不同大小和形状的anchor框来回归和分类目标&#xff0c;例如faster rcnn、retinanet和yolo等。a…

2 anchor-base和anchor_free两者的优缺点

anchor-base和anchor_free两者的优缺点 anchor-base和anchor_free两者的优缺点 一、什么是anchor二、anchor-base和anchor-free的区别三、anchor-free和single anchor三、anchor-base和anchor-free的优缺点 参考 一、什么是anchor 从字面的意思解释&#xff0c;anchor就是船锚…

Anchor-Free总结

目录 Anchor-Free综述 一. CornerNet 1.1 概述1.2 模块介绍 1.2.1 Heatmap1.2.2 Offset1.2.3 Grouping Corners1.2.4 Corner Pooling1.3 总结二. CenterNet 2.1 概述2.2 Center-Regression三. FCOS 3.1. 概述3.2. 模块介绍 3.2.1 论文思路简介3.3.2 回归形式3.3 参考文献四 ATS…

【AI面试】Anchor based 、 Anchor free 和 no anchor 的辨析

深度学习的目标检测算法,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整(回归)区域边界,从而更准确地预测目标的真实边界框(ground-truth bounding box)。 目标检测算法会需要做两个事情: 推荐区域框是否有目标(positive or …

一文读懂anchor-base和anchor-free

1. 从Faster-RCNN看Anchor Faster-RCNN相对于Fast-RCNN的一个改进是引入了RPN网络&#xff0c;RPN用于区域推荐&#xff0c;替换了此前的SS算法使得网络在整体上更加的CNN化。那么RPN是怎么进行区域推荐的&#xff1f; 简单来说RPN先列举出数万个矩形框&#xff0c;然后用卷积…

目标检测3--AnchorFree的FCOS

文章目录 1.介绍2.FCOS中使用的方法2.1 网络结构2.2FCOS中使用FPN的多级预测2.3FCOS中的中心度 3.mmdetection中FCOS源码参考资料 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 1.介绍 论文:《FCOS: Fully Convolutional One-Stage Obj…

浅谈Anchor-Free发展历程

1.早期探索&#xff1a; DenseBox: https://arxiv.org/abs/1509.04874 YOLO: https://arxiv.org/abs/1506.02640 2.基于关键点&#xff1a; CornerNet: https://arxiv.org/abs/1808.01244 ExtremeNet: https://arxiv.org/abs/1901.08043 3.密集预测: FSAF: https://arxiv.org/a…

Anchor-Free系列之FCOS:A Simple and Strong Anchor-free Object Detector

Anchor-Free系列之CornerNet: Detecting Objects as Paired Keypoints_程大海的博客-CSDN博客 Anchor-Free系列之CenterNet&#xff1a;Objects as Points_程大海的博客-CSDN博客 Anchor-Free系列之FCOS&#xff1a;A Simple and Strong Anchor-free Object Detector_程大海的…

Anchor Based和Anchor Free

Anchor Based和Anchor Free之间区别主要有以下两点&#xff1a;1.分类差异&#xff08;关键正负样本定义&#xff09;2.回归差异 1.分类差异&#xff1a; 现阶段的算法多尺度预测&#xff0c;即GT是由哪一个特征层和位置Anchor预测。 Anchor Based是由IoU来确定哪层和哪个位置…

解读《Bridging the Gap Between Anchor-based and Anchor-free Detection》

张士峰大佬近期发了一篇论文解读Anchor-base和Anchor-free方法间的差别&#xff0c;其本质在于正负样本的选取方式不同。 论文&#xff1a;《Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection》 链接&#xff1a;ht…

anchor-free方法总结

cornernet&#xff0c;centernet&#xff0c;onenet&#xff0c;fcos 这几篇论文的引用关系&#xff08;提出先后顺序&#xff09;&#xff1a; 将按照上面的顺序&#xff0c;从背景、标签分配等方面说明区别于联系。 一、背景&#xff1a; Cornernet&#xff1a;认为使用a…