背景

在忙完了一系列大大小小的事情之后,又开始进入满血状态的学习之旅。

线程

定义:一个基本的CPU执行单元或者说是程序执行流的最小单元,比进程更小的可独立运行的基本单位。

作用:减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

分类

  • 守护线程:守护用户线程的线程,在程序运行时为其他线程提供一种通用服务。

    1
    2
    //设置该线程为守护线程
    thread.setDeamon(true)
  • 非守护线程(用户线程)

    • 主线程(UI线程):Android系统在程序启动时会自动启动一条主线程,用于处理四大组件与用户交互的事情(UI,界面交互相关)。
    • 子线程(工作线程):用户手动创建的线程,用于处理耗时的操作(网络请求,I/O操作等)。

守护线程与非守护线程的区别

最主要的区别是虚拟机是否已经退出,当所有的用户线程结束时,因为没有守护的必要,所以守护线程也会中止,虚拟机也同样退出,反过来,只要用户线程还在运行,守护线程就不会中止,虚拟机就不会退出。

多线程

定义:一个程序运行产生多个线程(任务)同时进行,本质是并发执行程序。

使用多线程的目的:提高CPU资源的利用率。

  • 避免阻塞
  • 避免CPU空转
  • 提升性能

并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU操作层面不是真正的同时。

并行:多个CPU实例或多台机器同时执行一段处理逻辑,是真正的同时。

线程安全:在并发的情况下,代码经过多线程的使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存CPU是不是够用就好了,如果线程不安全的话,那么程序执行的结果就不会是我们想要的结果。

同步:发送一个请求,等待返回,然后再发送下一个请求,同步可以保证安全性。

异步:发送一个请求,不等待返回,随时可以再发送下一个请求,异步可以提高效率,可以并发执行多项工作。

多线程编程的两大原则

  • 不要阻塞主线程:解决(将耗时任务放在工作线程中执行)
  • 不要在UI线程之外的更新UI组件:解决(将更新UI组件放在主线程中执行)

多线程的调度

  • 分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
  • 抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同就以轮流的方式获取CPU资源。

进程

定义:实体的运行过程。

作用:使多个程序可并发执行,以提高系统的资源利用率和吞吐量。

进程状态以及状态转变

状态转换示意图