引言:博主本人最近正在准备着一个温度传感器 Android 客户端的项目,想把这个项目作为练习,希望在这个项目过程中能够深入学习 Android 后台编程的重点难点。这不,做这个项目一开始遇到的难题就是多线程开发了。本来以为将耗时任务开到一个线程中,同时开一个线程接收数据这样一个编程过程会比较简单,实际做起来很麻烦,才发现这涉及到数据结构,线程池, Android 四大件之 Service ,以及线程之间的通行(消息机制)等等重点难点,项目一直停滞不动,所以这才回来再认真看看并总结多线程编程的知识
进程与线程
在计算机基础知识中对于进程是这么介绍的,进程简单说来就是系统中一个软件的一次运行实例,而线程可以说是该运行过程中的多次运行过程。即一个进程可以有多个线程实例,这些线程之间是分享进程内的资源的。而进程与进程间的共享数据就没有那么简单,不同进程(可以理解为不同 App )需要由相同的 UID 才可以进行共享数据。还有进程与进程之间的通信还有 IPC 机制(Inter-Process Communication),关于该机制本人还暂未深入研究,只是知道这一机制的存在。而在 Android 中,根据 Google 的官方文档 进程与线程|Android Developers 中的阐述。我们在日常生活中从桌面启动器点击一个 APP 的图标,打开了某个应用界面。此时虚拟机会开启一个新的线程,该线程也就是该 App 的一次运行实例,也是概念上的进程。线程是调用 CPU 资源的最小单元,因此我们会认为是开启一个新的线程,这个线程也是我们说的进程,只是该进程目前为止还只有一个线程。而该线程成为主线程,也是我们所说的 UI 线程,该线程主要处理界面交互相关的逻辑,因为用户随时会和界面发生交互。这也就是我们所说的单线程模型, Android 是这样, Java 中同样也是如此,主线程就是 Java 编程中的main()
方法。关于如何形象的理解进程与线程之间的关系,强烈推荐大家阅读参考进程与线程的一个简单解释此篇文章。
并发与并行
总体概念
- 并发:在单核 CPU 系统中,系统调度在某一时刻只能让一个进程运行,虽然这种调度机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的进程让其运行的方式叫并发
- 并行:在多核 CPU 系统中,可以让两个以上的进程同时运行在不同的物理核心上,这种运行的方式就是并行
区别
- 并发在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,因为 CPU 计算速度很快,从宏观上看,好像这些进程都在同一个时间点执行
- 并行是真正的细粒度上的同时进行:既同一时间点上同时运行着多个进程
多进程
多进程的优点之一是能充分使用多处理器体系结构,以便每个进程能并行运行在不同的处理器上。而使用多线程加强了并发功能(在不谈论 Intel 的 HT 技术或者 AMD 的 SMT 技术情况下)
超线程技术
“超线程”(Hyperthreading Technology)技术就是通过采用特殊的硬件指令,可以把一个物理内核模拟成两个逻辑内核,在单处理器中实现线程级的并行计算,同时在相应的软硬件的支持下大幅度提高运行效能,从而实现在单处理器上模拟双处理器的效能。其实,从实质上说,超线程是一种可以将 CPU 内部暂时闲置处理资源充分“调动”起来的技术。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的 CPU 那样,每个 CPU 都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗 CPU 的性能。
参考资料
最后是广告时间,我的博文将同步更新在三大平台上,欢迎大家点击阅读!谢谢
网友评论