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传递消息等知识。

Android多线程编程(一)- 线程基础相关推荐

  1. 线程与进程、Android多线程编程

    线程与进程.Android多线程编程 目录 一.概念 1.程序 2.进程 3.并发 4.并行 5.线程 二.Android中的进程与线程 1.安卓的进程 2.安卓的线程 三.Android多线程编程 ...

  2. android: 多线程编程基础

    9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 ...

  3. Android开发实例——倒计时器——Android多线程编程

    文章目录 一.倒计时器功能描述 二.实现步骤 1.新建Activity,命名为ThreadDemo 2.设计ThreadDemo 的布局文件 3.编写ThreadDemo.java 文件代码 3.1 ...

  4. android 多线程编程

    主线程的职责是创建.显示和更新UI控件.处理UI事件.启动子线程.停止子线程;子线程的职责是进行处理和向主线程发出更新UI消息,而不是直接更新UI. android 多线程编程报错: 05-14 15 ...

  5. Android多线程编程

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

  6. 多线程编程之三——线程间通讯

    七.线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而 ...

  7. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form{//声明线程数组Thread[] workThreads = new Thread[10 ...

  8. 多线程编程(2): 线程的创建、启动、挂起和退出

    python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...

  9. 多线程编程:线程死锁的原因以及解决方法

    多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...

最新文章

  1. 金山卫士UI原理解析(2)CBkWindow
  2. Java Error(三)
  3. 规则引擎:大厂营销系统资格设计全解
  4. 计算机黑屏策略,小黑w7系统诊断策略服务已被禁用的还原教程
  5. 第二章 Flask——Flask中的request
  6. 【机器学习】Pima数据探索--七种武器
  7. JavaScript等于 == 与 恒等于 === 的区别
  8. resnet152训练_ResNet改进版来了!可训练网络超过3000层!相同深度精度更高
  9. iOS更新系统服务器出错,iPhone 更新失败怎么办?更新 iOS 常见的错误代码及解决方法...
  10. 于歆杰pdf 电路原理_buck电路原理(于歆杰 电路原理pdf)
  11. Android开发——应用宝推广渠道出现MD5值重复,请勿重复上传
  12. navicat 1062报错
  13. Dlib模型之驾驶员疲劳检测总结(可视化界面)
  14. 如何关闭笔记本自带键盘
  15. python数学符号代码_用Python学数学之Sympy代数符
  16. 对建立奉贤区区级工程技术中心的企业给予30万元奖励
  17. 在VS中给源文件用文件夹分类/在VS中变更源文件路径
  18. DOOM之父约翰·卡马克
  19. 关闭msmpeng_你知道吗?把电脑系统里的这些进程关闭掉,可以提升系统流畅
  20. win10滑动关机代码bat_win10滑动关机代码bat_win10设置自动关机和取消自动关机的bat命令...

热门文章

  1. 斯坦福大学数据可视化课程学习笔记:第一节 可视化的发展与目标
  2. Android--实现类似支付宝的功能拖拽、增删
  3. Python爬取基金数据案例
  4. 在哪把iphone的计算机,iphone备份在哪?iPhone备份方法
  5. 微信小程序图片自适应高度问题
  6. 【数据结构】栈和队列
  7. PC 如何阻止弹出 安全警告框
  8. registermodule 微前端_麦饭:可能是你见过最酷最简单的微前端解决方案
  9. 致敬博士-博士学位真的那么重要吗
  10. windows 64使用nasm