程序
是为完成特定的任务,用某种语言编写的一组指令的集合,即一段静态的代码,或者说代码块。
进程
是一个程序的执行过程,或者说是正在运行的一个程序,这是一个动态的过程:有它自身的产生、运行、消亡的过程,也就是生命周期。
- 例如运行中的浏览器。在没有使用的时候它是一个程序,当我们使用它搜索、看新闻、的时候,它变成了一个进程。
- 程序是静态的,进程是程序运行之后的状态。
- 进程是资源分配的单位,系统会在运行时给每个进程分配不同的内存区域。
线程
线程是进程的进一步细化,是一个程序内部的一条执行路径
- 如果一个进程中可以并行执行多个线程,那么可以说这个进程对应的程序是支持多线程的。
- 比如360同时进行垃圾清理和木马查杀就可以看作并行执行两个线程。
- 线程作为进程的调度和执行单位,每个线程都有自己独立的程序计数器和运行栈,同时线程之前的切换开销比较小。
- 一个进程中的多个线程共享进程的内存空间,可以访问相同的变量和对象,这使得线程之间的通信更加简单、高效。但是也会造成数据的安全隐患
如上图所示,这是JVM 的内存模型,其中红色线框的是线程私有的,每个线程都有自己的一份,但是黑色框的方法区和堆是整个进程的,所有线程共享的内存,如果多个线程对其中的数据进行了修改,就有可能造成安全的问题,这就是线程不安全的引出。
而线程同步就是为了解决线程不安全的问题而产生的。
单核Cpu与多核Cpu
- 单核:假的多线程,因为在一个时间单元(时间点)内,只能执行一个任务。例如后厨只有一个厨师,他能在一个菜刚下锅的时候马上去炒另一个菜,后厨能够源源不断的上菜,让你看起来是有多个厨师,实际上在一个时间点,他只能炒一个菜。
- 多核:多个厨师同时炒多个菜。
- 一个java应用程序Java.exe 至少有三个进程:main主线程、gc垃圾回收线程,异常处理线程。
并行与并发
- 并行:多个Cpu同时执行多个任务。
- 并发:一个Cpu(采用时间分片)同时执行多个任务。
使用多线程的优点
- 背景:在单核Cpu的情况下,只使用单线程先后完成任务(先后完成),由于线程切换的原因,会比多线程更快一些,那为何还要使用多线程呢。
- 优点:
- 提高应用程序的响应,对图形化界面更有意义,能够提高用户体验。
- 提高计算机Cpu的利用率,尽可能的压榨其性能。
- 改善程序结构,将长且复杂的进程分为多个线程,独立运行利于理解和修改。
什么时候需要多线程?
- 程序需要同时执行两个或多个任务
- 如上面说到的360 既要查杀木马又要清理垃圾
- 程序需要执行一些等待的任务时。
- 比如浏览网页时,在网络条件不好的情况下总是文本先出现,图片后出现,加载图片就是一个等待的任务。
- 需要一些后台运行的程序时
- 如java 程序的垃圾回收线程,主线程在运行,垃圾回收不可能等主线程运行完成之后再进行垃圾回收,这样内存很容易就被占满了。