本文是多线程系统文章的第一篇,先介绍一下一些基础概念。
程序是由某种编程语言(C、Java等等)的指令和数据的有序集合,能够完成某个特定任务,是一段静态的代码。
进程是程序在内存中分配的空间,也就是正在操作系统中运行的程序,是一个动态的过程。
进程的特点:
虽然进程的出现,使得操作系统的性能??提升,但是随着时间的推移,?们并不满??个进程在?段时间只能做?件事情,如果?个进程有多个?任务时,只能逐个得执?这些?任务,很影响效率。
比如杀毒软件在检测?户电脑时,如果在某?项检测中卡住了,那么后?的检测项也会受到影响。或者说当你使?杀毒软件中的扫描病毒功能时,在扫描病毒结束之前,?法使?杀毒软件中清理垃圾的功能,这显然无法满足人们的要求。
为了使进程内的多个子任务同时运行,人们提出了线程的概念,在进程之中创键线程,每个线程负责一个单独的子任务。
线程的特点:
并行(parallel):是指同一时刻有多条指令在多个处理器上同时执行。
并发(concurrency):是指同一时刻只能有一条指令执行,但是多个进程指令被CPU快速轮换执行,使得宏观上感觉多个进程同时执行的感觉,但是微观上不是同时执行的,而是将时间分成若干段。
比喻:QQ和微信同时运行,是并行。在微信上同时与多人聊天,是并发。
这里涉及到线程的运行方式:CPU采用时间片轮转,即为每个线程分配一个时间段,称作它的时间片。一个线程在它的时间片结束之前如果没有结束,操作系统会结束掉当前线程的运行,保存当前线程的状态(程序计数器、运行栈等等),并将CPU分配给另一个线程(这个过程称之为上下文切换)。如果线程在时间片结束之前完成任务或者阻塞,则CPU立即进行切换,不用等待时间片结束。
采用线程+CPU时间片轮转的方式操作系统,使单核CPU在宏观上看起来同一时刻执行多个任务,但是微观上单核CPU同一时刻只有一个任务在执行。
**同步:**多个任务需要执行的时候,这些任务只能逐个执行,如果先前的任务还没有完成,后面的任务则不能执行,一个任务的执行会导致整个流程进入短暂的等待,这些任务不能并发执行。
异步:多个任务需要执行的时候,这些任务可以并发的执行,一个任务的执行并不会导致整个流程进入等待。
例如有两个任务A和B,如果是同步执行的话,当A执行的时候,任务B只能等待任务A执行完毕才能执行,期间只能等待。而异步的话,任务A和任务B可以并发执行,任务B不需要等待任务A执行完毕
Java虚拟机栈:
我们知道JVM是由堆、栈和方法区组成,其中栈就是每个线程所私有的内存空间。每个栈中包含了一个程序计数器和多个栈帧。堆是线程的共享区域。
JVM内存中关于进程和线程:
栈和栈帧的内存图:
如果发生了线程切换,这时候需要保存当前线程的上下文信息,留待下次抢占到了CPU资源之后可以恢复线程。保存完成之后,就加载下一个要占用CPU资源的线程,这就是上下切换。
引发上下文切换的情况:
wait()
、sleep()
方法等等。