开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
2.1 进程与线程
进程
- 程序是由指令和程序组成的,指令加载在CPU中,程序加载在内存中,在指令加载过程中还涉及磁盘IO等,
- 因此进程就是用来加载指令,管理内存,管理IO的
线程
- 进程分为一个或多个线程,一个称为单线程,多个称为多线程
- 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
- Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作 为线程的容器
二者对比
- 进程有共享的内存空间,供其内部的线程共享
- 不同计算机之间的进程需要通过网络遵守共同的协议比如HTTP
- 线程是可以共享进程内的内存,比如多个线程可以访问同一个共享变量
- 线程更轻量,线程上下文切换比进程上下文切换成本低
2.2 并行与并发(concurrent)
并发(concurrent)是同一时间应对(dealing with)多件事情的能力 并行(parallel)是同一时间动手做(doing)多件事情的能力(因为有多个CPU)
2.3 异步调用
- 需要等待结果返回,才能继续运行就是同步
- 不需要等待结果返回,就能继续运行就是异步
多线程可以让方法执行变为异步的,比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停.
生活中的例子就是煮开水时如果没有脑子,在这段时间内就什么都干不了,只有等开水煮好了才会去干其他事 计算 1 花费 10 ms 计算 2 花费 11 ms 计算 3 花费 9 ms 汇总需要 1 ms
如果使用串行则需要31ms,使用并行则仅仅需要11 + 1 = 12ms
进行磁盘IO时是不用占用CPU的,但是我们拷贝文件时一般是阻塞IO,就相当于给多线程上了个锁,其他线程无法同时进行,也就降低了效率,因此有非阻塞IO和异步IO的提出
关于Java并发的理论知识这里就差不多学完了,下一章让我们来看看具体的实现吧