Android多线程编程(一)- 线程基础

article/2025/9/15 6:11:33

Android多线程编程(一)

到了学习下一部分了,多线程编程一直都是Android经常使用的部份,在进行网络请求或者访问数据库时,为了避免主线程被耗时操作阻塞了进度,通常都会开启子线程进行处理,多线程编程在Android属于相当重要的一部分,接下来的阶段我会开始学习多线程编程,并且把学习笔记记录在这里。

我们通常会看到AS抛出的异常,告诉我们**操作不能在主线程中进行,或者说更新UI的操作必须在UI线程中进行,这个所谓的主线程和UI线程其实是同一个,Android应用在创建的时候就会自动的开启一个线程,这个线程就是我们说的主线程或者UI线程。下面开始我们正式开始学习线程知识:

线程基础

进程,线程

说到线程不得不先说一下进程,这两个我们从很早之前就听过了,它们之间的区别以及联系想来都已经了解过一部分了,不过还是一步步说一下吧:

进程

进程是一个操作系统的结构基础,可以看成是线程的容器,是程序在一个数据集合上运行的过程,是程序进行资源调度以及资源分配的基本单位,我们可以理解为,一个程序就是一个进程,比如手机上的QQ,微信,这都是一个进程。

线程

线程是操作系统可以操作调度的最小单元,进程是线程的容器,线程也就是进程的组成部分,我们可以理解线程为实现程序的各个组成部分,比如QQ,这是一个进程,他其中的线程有的负责网络连接,有的负责文件下载,这就是线程。这些线程各自有各自的作用,也就有各自独立的变量,数据结构·,链表,堆栈等,不过他们都可以访问这个进程的共享变量。

多进程

虽然我们写的是多线程操作,但是操作系统中也是有多进程的,先来看一下多进程的优点:

1.目前的计算机都是多核CPU,多个任务可以并行执行,那么多进程也就是多个任务同时执行,会提高CPU的使用效率;

2.目前为止,计算机提高程序性能的唯一办法,就是多核以及并行程序;

当然多进程也是会有缺点的,多个进程之间通讯比较繁琐,而且不容易切换,如果一个程序的每个功能都做成一个进程的话,计算机或者说手机,使用起来会极其不方便。

多线程

与进程相比,线程创建和切换的代价会小很多,同时多线程可以进行信息共享,大大提高了数据共享方面的效率,除了和线程相对比的好处之外,他的优点不仅在此:

1.多线程可以减少程序响应时间,例如网络请求,如果当前网络质量不佳,这个时候就会耗费很长时间来进行处理,这个时候你的程序就会进行等待,直到网络处理完成,才能进行其他操作,而开启多线程则可以把这个请求放置在一个单独的线程中去,程序依然可以进行其他操作;

2.在使用多线程的时候,我们的程序结构会得到简化,在理解程序以及维护程序的时候效率会大大加强。

六种线程状态

线程在运行的时候存在这周期,周期中存在六种不同的状态,我们来了解一下这六种状态:

1.New状态:线程处于刚被创建状态,还没进行start方法,在start之前还有一些准备工作要做;

2.Runnable状态:线程处于可运行装状态,在线程调用了start方法后,就会处于这个Runnable状态,这种状态下的线程可能正在运行,也可能没有运行,取决于操作系统给线程提供的运行时间;

3.Blocked状态:线程处于阻塞状态,表示线程被锁给阻塞了,这个时候线程不运行;

4.Waiting状态:线程处于等待状态,这个时候线程什么都不做,就是等,直到线程调度器激活它;

5.Timed waiting状态:线程处于超时等待状态,和上面基本类似,不过不同的是设置了时间,在指定的时间自动返回;

6.Terminated状态:线程处于终止状态,表示当前线程执行完毕,出现这种状态有两种情况,一种是run()方法执行完毕正常退出,另外一种就是有异常,直接终止了run()方法,从而线程直接终止。

总结来说这几个状态的执行顺序以及执行条件就是:

线程在创建之后进入New状态,在执行start()后进入Runnable状态,这个时候不确定是否在运行,随后如果执行了wait方法后,就会进入Waiting状态,进入等待状态的线程需要其他线程通知它才会返回运行状态,而超时等待则更高一筹,他给自己设置了时间,时间一到就自己返回运行状态,当这个线程没有获得锁的话,也就是无法运行,进入到Blocked状态,获得锁后会重新进入运行状态,在所有任务执行完毕或者捕获到异常状态的时候,线程会终止,也就是进入到Terminated状态。

线程的创建

经过了这么多的基础知识储备,我们进入到使用线程这部分,使用线程之前自然要先进行线程的创建,线程的话,一共有三种创建方式,我们来了解一下,当然最重要的,也就是我们需要着重掌握的就是前两种:

一:通过Thread进行创建

我们之前多多少少也接触过一些线程的知识,这里就没用的话不多说了,写一部分重要内容,然后就是具体实现部分:

通过Thread进行创建其实也就是继承Thread父类,而Thread本质上来说也是一个实现了Runnable的实例,具体执行代码:

public class TestThread extends Thread{public void run() {// 用于处理耗时逻辑}
}

就这样我们的线程就已经创建好了,不过这个时候也就是之前说过的处于状态NEW,需要调用start方法才能进入可运行状态在需要的地方创建实例:

TestThread testThread = new TestThread();
testThread.start();

这样就可以了,可以执行TestThread中的run()中的操作了。

二:通过Runnable接口进行创建

和上面的类似,不过这次我们是实现Runnable接口,相比于继承父类,实现接口更为的方便和可操作,因为Java是单根继承的特性,因此一般我们都会选择第二种的方法:

private class TestThread implements Runnable{public void run(){// 用于处理耗时逻辑}}

和之前一样,就只是更改了实现接口这个部份,在进入可运行状态时,还是需要Thread的start()方法:

new Thread(new TestThread()).start();

就这样,不过这种看起来就很麻烦,我们通常在安卓中会采用匿名内部类的方法:

 new Thread(new Runnable() {@Overridepublic void run() {// 用于处理耗时逻辑}}).start();

一目了然。

就这么多吧,下一篇开始写线程的同步问题以及异步问题,也就是避免死锁,handler传递消息等知识。

在这里插入图片描述


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

相关文章

Android多线程

我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时, 比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应…

Android多线程机制详细解析

或许你曾经需要项目中进行后台工作比如数据库访问或者网络连接,如果你按照以前的做法,直接在点击事件或者onCreate方法中直接调用访问数据库或者服务器的方法,你就会遇到大多数Android程序员都遇到过的这么一个错误:android.view.…

Android多线程:请收好这份全面详细的多线程学习指南!

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 今天,我将献上一份全面 & 详细的Android多线程学习指南,希望你们喜欢。 Carson带你学多线程系列 基础汇总 Android多线程:基础知识汇总 基础使用…

Android开发之路——多线程

前言 多线程作为Android开发中相对而言较为高阶的知识,其中用到相关的知识点是非常的多,所以在我们需要进行设计或者写多线程的代码就必须要进行相对谨慎的处理,这样就由必要对其要有着比较系统化的认知 Android多线程机制 我们一般将Andro…

Android多线程编程

Android多线程编程 其实就是将耗时操作放在子线程里运行,防止主线程被阻塞,影响软件使用。 线程的基本用法 定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编写耗时逻辑即可,如下所示…

Android 多线程应用

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

android多线程讲解与实例

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

Android多线程并发的优化

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

Android多线程(Handler篇)

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

Android 多线程实现方式

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

Java多线程,Android多线程

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

Android多线程开发详解

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

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

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

Android 中的多线程简介

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

anchor free和anchor based的区别

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

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

anchor-free 和 anchor-based 区别 anchor-free和anchor-based是两种不同的目标检测方法,区别在于是否使用预定义的anchor框来匹配真实的目标框。 anchor-based方法使用不同大小和形状的anchor框来回归和分类目标,例如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 从字面的意思解释,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网络,RPN用于区域推荐,替换了此前的SS算法使得网络在整体上更加的CNN化。那么RPN是怎么进行区域推荐的? 简单来说RPN先列举出数万个矩形框,然后用卷积…