进程: 资源单位
进程: 把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度
Thread类与大部分的Java类库API有着显著差别,它的所有关键方法都被声明为Native。在Java类库API中,一个Native方法往往就意味着这个方法没有使用或无法使用平台无关的手段来实现
Java线程实际上也有多种实现方式
12.4.1 线程的实现
无关Java , 就说线程 能怎么实现, 主要有三种方式:
- 使用内核线程实现(1:1实现)
- 使用用户线程实现(1:N实现)
- 使用用户线程加轻量级进程混合实现(N:M实现)
Java 普遍是第一种, 直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给底下的操作系统去处理
内核线程
内核线程:
直接 操作系统内核支持的线程,操作系统内核 完成线程切换,内核 通过 操纵调度器 对线程调度,每个内核线程可以视为内核的一个分身
映射:
多个 内核线程 对一个cpu
轻量级进程:
程序(P)一般不会直接使用 内核线程 而是使用 内存线程的高级接口 -----[轻量级进程]LWP
每个轻量级进程 都 由一个 内核线程 支撑, 二者 1:1
坏处:
- 代价高
因为基于 内核线程,线程的各种操作 都需要系统调用, 系统调用代价高, 需要内核态 用户态 来回切换(这个切换就是上下文切换,要保护现场,所以代价高),都对应一个内核线程的支撑, 需要消耗内存资源 - 因此 支撑的线程 有限
12.4.2 Java线程调度
协同式
协同式调度的多线程系统,
线程的执行时间由线程本身来控制,
线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上去。
- 好处:
实现简单,而且由于线程要把自己的事情干完后才会进行线程切换,切换操作对线程自己是可知的,所以一般没有什么线程同步的问题。 - 坏处:线程执行时间不可控制,怕一个线程时间太长,甚至永远不完
抢占式
Java这个,
每个线程将由系统来分配执行时间,
线程的切换不由线程本身来决定。
譬如在Java中,有Thread::yield()方法可以主动让出执行时间,但是如果想要主动获取执行时间,线程本身是没有什么办法的。
12.4.3 状态转换
需要注意的是 中间的 Running
包括操作系统线程状态中的
- Running
- Ready
就是说,可以进行了, 但是不一定轮到进行, 是不是真的进行, 要看 操作系统内核的 操纵调度器 怎么调度, Java一点办法都没有











网友评论