读深入理解JAVA虚拟机-JAVA与线程

线程的实现
  • 先清楚一个基本概念,线程是比进程更轻量级的调度执行单位(线程是CPU调度的基本单位)。
  • 当下主流操作系统都提供了线程实现,JAVA语言提供了在不同硬件和操作系统平台下对线程操作的统一处理
  • 一般实现线程主要有三种方式:使用内核线程实现,使用用户线程实现和使用用户线程加轻量级进程混合实现
    • 使用内核线程实现:
      内核线程(Kernel-Level Thread, KLT)是由操作系统内核支持的线程,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到CPU上。
      另外程序一般不会直接去使用内核线程,而是通过KLT的一种高级接口:轻量级进程(, LWP),这个就是我们通常意义上说的线程。
      由于每个LWP都是由一个KLT支持的,且是先有KLT才有LWP的,因此他们的比例关系为1:1.

      优缺点:由于内核线程的支持,使得每一个轻量级进程称为一个独立的调度单元,即使一个LWP阻塞了,也不会影响整个系统的运行。
      但是它也有天然的局限性:LWP是基于内核线程的,各种线程操作,都需要进行系统的调用,而系统的调用的代价是相对高的,需要在用户态和内核态之间切换。而且KLT:LWP是一对一的关系,因此系统支持的LWP是有限的。
      轻量级进程和内核线程的关系

    • 使用用户线程实现:
      狭义上来说“用户线程”指的是:完全建立在用户空间上的线程,系统内核完全感受不到。即线程的建立、调度、销毁均在用户态中完成。
      这种方式,不用切换内核态,操作可以是非常快速且低消耗的,也可以支持更大规模的线程数量。其劣势也在于没有内核的支援,所有的线程操作都要用户程序自己完成,得要考虑诸如“阻塞如何处理”、”多处理器系统中如何将线程任务映射到其他处理器上“等复杂问题。现在使用用户线程的程序越来越少了
      用户线程和进程的关系

    • 使用用户线程加轻量级进程混合使用:
      在混合使用的实现下,既有用户线程,也存在轻量级进程。用户线程还是完全建立在用户空间上,因此用户线程的创建,切换,析构等操作依然廉价,并且还可以支持大规模的用户线程并发。而操作系统提供的轻量级进程则作为用户线程和内核线程的桥梁,这样就可以使用内核提供的线程调度功能及处理器任务映射功能,并且用户线程的系统调用是通过轻量级进程来完成,大大降低了整个进程被完全阻塞的风险。另外用户线程和轻量级进程的数量是不确定的,因此他们的比例为N:M

JAVA的线程
  • JAVA线程的实现:
    从JDK1.2起,JAVA线程模型为基于操作系统原生线程模型来实现的

  • 线程调度
    线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种:协同式线程调度(Cooperative Threads-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling)。
    协同式线程调度:线程的执行时间有线程本身来控制,线程把自己的工作完成后,主动通知系统切换到下一个线程上(优点:一个线程要完成后才切换,就不会有线程同步问题;缺点:万一某个线程有问题造成阻塞,那就一直阻塞了)
    抢占式线程调度:每个线程由系统来分配执行时间(不会导致阻塞问题)

    在JAVA中是“抢占式线程调度”,我们虽然可以让出执行时间,但是要获取执行时间的话,线程本身是没有办法的。但是我们可以通过设置线程优先级别来“建议”系统给某些线程多分配一点时间。在JAVA语言中一共有10等级可以设置。但是要注意的时,JAVA最终还是要靠操作系统来执行线程调度的,而不同的操作系统提供的线程优先级与JAVA优先级级数是不一样的,因此你有时设置的优先级就会变得“不靠谱”

  • JAVA线程状态:
    新建(New):创建后,尚未启动的线程状态
    运行(Runable):包括操作系统的Running和Ready状态,即此线程可能正在运行中或正在等待CPU分配时间
    无限期等待(Waiting):不会被分配时间,要等待被其他线程显示唤醒(没有设置timeout参数的wait()或join()方法)
    限期等待(Timed Waiting):不会被分配时间,等待一定时间后,自动唤醒
    阻塞(Blocked):等待获取一个排它锁
    结束(Terminated):线程终止
    线程状态装换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值