在 Android 中有主线程和子线程,主线程只有一个,子线程可以有多个,当有多个子线程时就是多线程了。多线程属于异步处理任务技术,该技术主要是为了提高应用效率问题。

线程?
线程是程序执行的最小单元。

多线程?
多线程就是多个线程一起执行。
例如:我们使用微信聊天的同时还能继续播放着公众号文章中的音频。

多进程?
进程是程序的基本执行实体。我们手机上的每个 App 都是一个进程。

在 Android 上是如何开启线程的呢?我了解的有下面两种方式
方式1:继承 Tread
方式2:实现 Runable 接口

推荐使用 方式2 来实现,继承在面向对象中是用来拓展新功能,显然这里不是拓展新功能。

伪代码如下:

public class MyRunnable implements Runnable{  @Override  public void run(){    // 实现具体逻辑    }}// 使用MyRunnable runnable = new MyRunnable();Thread thread = new Thread(runnable);thread.start();

Android 中的处理异步处理任务的方式还有以下几种:

  • Handler
    主要用来发送消息和接收消息,发送消息通过post方法实现,接收消息是通过dispatchMessage方法实现。

它的底层实现需要 MessageQueue 和 Looper的支持。主要流程是 Looper 通过无限循环去查找 MessageQueue 中是否有消息,有的话就处理消息,没有则一直待着。

**线程是由生命周期的,当线程执行完成后,线程生命周期便该终止了,线程退出。**而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出

  • HandlerThread
    它继承了 Thread,内部集成了 Looper 和 MessageQueue的线程,是一种具有消息循环的线程,在它的内部可以使用 Handler;

  • ntentService
    它是一个服务,系统对其进行封装,使其可以更方便的执行后台任务 IntentService 内部使用了 HandlerThread 来执行任务,当任务执行完成之后 IntentService 会自动退出。

从任务执行的角度来看, IntentService 更像是一种后台线程,但是 IntentService 又是一种服务,它不容易被系统杀死,所以可以保证任务能够一直执行。而如果只是后台进程,那么这个进程的优先级就会非常低,很容易被后台杀死。

  • Executors
    可以用于方便的创建线程池,Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。

在操作系统中,线程是操作系统调度的最小的单元,同时线程又是一种受限制的系统资源,即线程是不可能无限制的产生,并且线程的创建和销毁都会有相应的开销,所以在 Android中为了避免线程的无限创建,因此有了线程池的概念,主要是通过 Executor 来派生特定类型的线程池,不同种类的线程池又具有各自的特性。

  • AsyncTask
    是在 Executor的基础上进行封装,它实现耗时任务移动到工作线程中执行,并提供方便的接口实现工作线程和主线程的通信。其底层用到了线程池,而 IntentService 和 HandlerThread 底层则直接调用了线程。AsyncTask 封装了线程池和Handler,其主要是为了开发者在子线程中更新 UI
Android AysncTask 从源码角度简单理解它的使用限制原因
Android IntentService 从源码角度分析和简单使用
Android 中的线程池简单理解

参考

《Android 开发艺术探索》
《Android 高级进阶》

更多相关文章

  1. Android 主线程到底是什么、如何抛出ANR
  2. Android 的线程跟线程池
  3. Android 共享内存实现跨进程大文件传输(设计思路和Demo实现绕过B
  4. Android 性能优化——通过线程提高性能
  5. [置顶] 在单线程模型中Message、Handler、Message Queue、Looper
  6. Android多线程问题
  7. Android Handler 主线程 子线程 双向通信

随机推荐

  1. Android打开/关闭免提(SpeakerPhone)
  2. Android实现拖拉移动Item
  3. ubantu10.04配置android 开发环境
  4. 获取drawable里的路径
  5. Android基础教程——调节系统屏幕亮度
  6. github 简单记录
  7. 新手android中ListView实现音乐列表
  8. Android判断当前是否处于屏幕锁定状态
  9. 网络获取图片实现无线自动轮播
  10. 真正实现TextView跑马灯效果