android 多线程学习1:一些基础
android 多线程学习2:线程的创建与方法分析
android 多线程学习3:synchronized与volatile与线程安全对象
android 多线程学习4:线程池ThreadPoolExecutor
android 多线程学习5:AsyncTask
android 多线程学习6:HandlerThread
android 多线程学习7:Handler消息处理机制
一、进程与线程
1. 进程 :
通常一个任务就是一个进程。(如安卓中的一个应用通常就是一个进程)
进程是操作系统进行资源分配和调度的一个单位。
当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
2. 线程:
线程是进程中执行运算的最小单位。
3. 二者关系:
线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。
进程间的内部数据和状态都是相互完全独立的,因此进程间通信大多数情况是必须通过网络实现。线程本身的数据,通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。
4. java内存模型:Java中所有变量都储存在主存中,对于所有线程都是共享的(因为在同一进程中),每个线程都有自己的工作内存或本地内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,而线程之间无法相互直接访问,变量传递均需要通过主存完成,但是在程序内部可以互相调用(通过对象方法),所有线程间的通信相对简单,速度也很快。
进程与线程如上图所示:线程1-线程N共享进程的堆内存(heap)和方法区资源(Method Area),但是每个线程有自己的程序计数器(PC)和栈区(Stack)
程序计数器(PC)
其中 PC 计数器本质上是一块内存区域,用来记录线程当前要执行的指令地址,CPU 一般是使用时间片轮转方式让线程轮询占用的,因此当前线程 CPU 时间片用完后,要让出 CPU,这时 PC 计数器就会记录下当前线程下次要执行的命令的地址,等下次轮到该线程占有 CPU 执行时,就从 PC 计数器获取自己将要执行的命令的地址继续执行。
栈(Stack)
每个线程有自己的栈资源,用于存储该线程的局部变量,这些局部变量是该线程私有的,其它线程是访问不了的。
堆(heap)
堆是一个进程中最大的一块内存,是进程创建时候创建的,堆是被进程中的所有线程共享的。堆里面主要存放使用new 创建的对象实例。
如Object obj = new Object()
,在堆上创建一个Object对象的实例,需要注意的是obj作为一个引用变量,在内存中是存在stack上的,只是obj指向了Object在堆上的地址。
方法区(Method Area)
方法区用来存放 JVM 加载的类信息、常量、静态变量等信息,也是线程共享的。
二、 并行与并发
并行:是指同一时刻,多个命令在多个处理器上同时执行。
并发:是指在同一时刻,只有一条命令是在处理器上执行的,但多个进程命令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
三、 CPU核心数与JVM调度与多线程
1. cpu执行机制
CPU采用的是类似于时间片轮转的机制,对于各个线程的调度是随机的(分时调度)。操作系统中有多个进程,每个进程又有多个线程,cpu执行时将时间分成n个时间片段,在不同的时间片段中执行各个线程。
虽然单核CPU电脑同一时间内只能执行一个线程,但是单核cpu通过时间片轮转,快速的切换执行不同进程中的线程,使得多个进程在单一处理器上的并发执行。
同理,多核cpu就可以使得多个线程并行执行。在具有多个处理器的机器上,每一个处理器运行一个线程,可以有多个线程并行运行。当然,如果线程的数目多于处理器的数目,调度器依然采用时间片机制。因此,同一进程的多个线程可以在多个不同的cpu上并行执行。
2. JVM调度
在Java程序中,JVM负责线程的调度。 线程调度是指按照特定的机制为多个线程分配CPU的使用权,也就是实际执行的时候是线程,因此CPU调度的最小单位是线程,而资源分配的最小单位是进程。
JVM调度的模式有两种:分时调度和抢占式调度。
分时调度:是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;
抢占式调度:是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。既然是抢占调度,那么我们就能通过设置优先级来“尽量”的控制线程的运行顺序,注意是“尽量”,并不能确保顺序。
3. 多线程
线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。
线程是独立运行的,其不知道进程中是否还有其他线程存在。
线程的执行是抢占式的,也就是说,当前执行的线程随时可能被挂起,以便运行另一个线程。
一个线程可以创建或撤销另一个线程,一个进程中的多个线程可以并发执行。
(部分内容参考于网络,如有不妥,请联系删除~)
网友评论