线程进程并发并行
一、线程与进程
进程(process):简单对其理解就是一个应用程序的实例
- 深奥点的解释就是: 进程是CPU资源分配的最小单位
- 也就是CPU会为每个应用程序单独分配一块内存空间,该进程在内存空间是独立的、受保护的,里面存储了什么文本区域、数据区域、堆栈等等
- 如果想实现多个进程互相访问,好像要用到什么共享内存或者是socket技术
- 其他特性:
- 一个进程包括1~n个线程
线程(thread):而线程可以说是组合在进程类的一个个对象,共享本进程中的数据
- 深奥点的解释就是:线程是CPU调度的最小单位
- 所以它可以说是一段段执行流,用于对进程中的数据进行处理,所以说一个进程至少有一个线程
- 将各个线程切分成一段段时间片,然后交由CPU进行调度
- 其他特性:
- 可以对进程的某块内存区域设置锁,当A线程进来之后上了锁,那么其他线程必须排队等待锁释放。专业术语叫做互斥锁 (Mutual exclusion,缩写 Mutex)
- 也可以对进程的某块内存区域设置限定的访问数量,比如设置了3把钥匙,如果当前内存已经有三个线程在操作,那么其他线程进来前就要排队等待,返回钥匙。这种做法专业术语叫做信号量 (Semaphore)
- 可以看出互斥锁是信号量的一种特殊情况,当只有一把钥匙时
二、并行与并发
并行是从微观上,精确到某一时刻,存在多段执行流在同时执行
并发是宏观上,CPU执行速度飞快,正常人无法感知到,以为是在并行执行
并发实现:指在单核CPU处理器上,存在多个进程 / 线程时,多个进程 / 线程 “轮流”使用单个CPU资源
并行实现:指在多核CPU处理器上
- 同一个进程下的不同线程分别在不同的核处理器上,在同一时刻可以并行执行
SO:能知道CPU核数量也是很重要,Java
基础类库lang
包下提供了一种快速查询CPU逻辑处理器数量的方法
System.out.println(Runtime.getRuntime().availableProcessors()); // me out: 8
三、线程的几种状态
Java层面的线程状态
- 在
Thread
类下存在这样一个内部枚举State
类
public enum State {
// 新生
NEW,
// 运行
RUNNABLE,
// 阻塞
BLOCKED,
// 等待
WAITING,
// 计时等待
TIMED_WAITING,
// 终止
TERMINATED;
}
四、Java类库中wait与sleep区别
- 所属类区别
wait
方法来自于Object
类,所以Java
任何类都有该方法sleep
方法来自于Thread
类- 但是注意企业开发中做休眠,不会使用
Thead.sleep
,而是使用JUC
并发包下的TimeUnit
类
- 但是注意企业开发中做休眠,不会使用
- 锁释放区别
wait
方法会释放锁sleep
方法不会释放:因为它的作用就是让线程休眠
- 使用范围不同
wait
方法只能使用在同步代码块中。原因是它不仅会拿锁还会释放锁,锁要有归还的位置sleep
方法应用于任何地方