一马平川
不积跬步无以至千里,后继才能薄发

Java与线程模型

2020年07月19日
0
未分类

Java与线程模型

线程的实现

内核线程实现

  • 定义:内核线程(Kernel-Level Thread,KLT):直接由操作系统内核支持的线程,由内核来完成线程切换

  • 优势:实现依赖内核,实现简单

  • 劣势:部分操作需要从用户态切换到内核态,开销较大

用户线程实现

  • 定义

    • 广义:一个线程不是内核线程,就可以认为是用户线程,在这个定义上讲,轻量级进程也是用户线程,但是轻量级进程的实现是建立在内核之上的,需要进行系统调用,效率会受到影响
    • 狭义:用户线程指的是完全建立在用户空间的线程库上的线程实现,内核无法感知到用户线程。用户线程的建立、同步、销毁和调度在用户态完成,无需切换到内核态,操作消耗较低。
  • 优势

    • 操作消耗低
    • 支持规模更大的线程数量
  • 劣势

    • 实现十分复杂

用户线程+轻量级进程混合实现

  • 定义

    • 轻量级进程(Light Weight Process,LWP):内核线程的一个高级接口,通常意义上的线程,每个轻量级进程都有一个内核线程支持
    • 用户线程+轻量级进程混合实现:轻量级进程作为用户线程和内核线程的桥梁,使得用户线程可以使用内核提供的线程调度功能、处理器映射。用户线程和轻量级进程数量比不定,为N:M

Java线程的实现

  • jdk1.2之前:用户线程(绿色线程)实现
  • jdk1.2:基于操作系统原生线程模型实现,Sun JDK使用java线程和轻量级进程是1:1的模型

Java线程调度

调度方式

  • 协同式线程调度(Cooperative Threads-Scheduling)

    • 定义:线程执行时间由线程自己决定

    • 优点:实现简单

    • 缺点:某一线程执行时间过长会导致系统崩溃

  • 抢占式线程调度(Preemptive Thread-Scheduling)(Java线程调度)

    • 定义:线程由系统分配执行时间

    • 优点:每个线程都可以分配到cpu时间分片

    • 缺点:需要保存现场,切换上下文时有额外的开销

线程优先级

  • Java线程优先级:1-10级
  • Windows线程优先级:1-7级
  • Solaris线程优先级:2^32级

状态转换

  • 新建(New):创建后还没有启动的线程处于这种状态

  • 运行(Running):包括了操作系统线程状态中Running和Ready,就是说在这个状态的线程,可能在执行,也可能等待CPU分配执行时间

  • 无限期等待(Waiting):处于这种状态的线程不会分配到CPU执行时间,需要被其他线程显式唤醒

    • 没有设置Timeout参数的Object.wait()方法
    • 没有设置Timeout参数的Thread.join()方法
    • LockSupport.park()方法
  • 限期等待(Timed Waiting):处于这个状态的线程不会被分配CPU执行时间,不过无须等待被其他线程显式唤醒,在一定时间后会由系统自动唤醒

    • Thread.sleep()方法
    • 设置了Timeout参数的Object.wait()方法
    • 设置了Timeout参数的Thread.join()方法
    • LockSupport.parkNanos()方法
    • LockSupport.parkUntil()方法
  • 阻塞(Blocked):线程被阻塞,线程在等待获取一个排它锁时,进入阻塞状态,在另一个线程放弃这个锁时,返回Running状态

  • 结束(Terminated):线程已经结束执行

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔