线程的3种实现
1.内核线程实现
内核线程实现的方式也叫1:1实现。内核线程(kernel level thread,KLT)就是直接由操作系统支持的线程。
一般来说应用程序不会直接使用内核线程,而是使用内核线程的高级接口-轻量级进程(light weight process,LWP)。每个LWP都由一个内核线程支持。
优点:并发程度高,用户进程的某个线程被阻塞时,其他LWP还可以继续运行
缺点:线程的创建、析构、同步需要系统调用,要在用户态、内核态之间来回切换。LWP也会占用资源。
2.用户线程实现
用户线程实现也叫1:N实现。
优点:用户线程的建立、销毁、同步都在用户态完成,效率高
缺点:并发程度低,实现复杂
3.混合实现
也叫N:M实现。既有用户线程,也有轻量级线程。
Java线程的实现
java线程的实现不受虚拟机规范的约束,主流的java虚拟机都采用了内核线程实现(1:1实现)。比如hotspot,每个java线程直接映射到一个操作系统原生线程,中间没有额外的间接结构,线程的调度全权交给操作系统去处理(但是虚拟机会给线程设置优先级)。
线程优先级
线程的调度由操作系统全权执行,但时Java虚拟机可以给线程设置优先级。java语言一共有10个线程优先级别(从Thread.MIN_PRIORITY 到 Thread.MAX_PRIORITY)。
状态转换
java语言中定义了6种线程状态:
- 新建(New):创建后未启动的线程
- 运行(Runnable):