1.Java线程的实现
JDK1.2之前 | JDK1.2之后 |
---|---|
用户线程的实现 | 基于操作系统原生线程 |
所以,在JDK1.2之后操作系统支持怎样的线程模型决定了Java虚拟机的线程是怎样映射的。
2.Java线程调度
两种调度方式:
- 协同式调度
- 抢占试调度
2.1协同式调度
线程执行时间由线程本身控制,线程把自己的工作执行完了之后,要通知系统切换到另一个线程上。
优点 | 缺点 |
---|---|
实现简单,没有线程同步的问题 | 线程执行时间不可控制,若线程发生阻塞,则程序会一直阻塞在那里 |
2.2抢占式调度
每个线程执行的时间由系统分配,线程的切换不由线程本身来决定
缺点 | 优点 |
---|---|
线程安全问题 | 线程执行时间可控,不会因为一个线程导致整个进程阻塞 |
Java使用的是抢占式线程调度
3.线程优先级
Java语言一共设置了10个级别的线程优先级(Thread.MIN_PRIORITY
-Thread.MAX_PRIORITY
)在两个线程同时处于Ready状态时,优先级越高的线程越容易被系统选择执行。
但是优先级并不是太靠谱,因为Java线程是通过映射到操作系统的原生线程上来实现的,所以调度还是取决于操作系统,而操作系统的优先级可能不与Java线程优先级一一对应。