操作系统线程状态和Java线程状态的区别与联系

本文对比了操作系统线程的五种状态(新建、就绪、运行、等待、终止)和Java线程的六种状态(NEW、RUNNABLE、WAITING、TIMED_WAITING、BLOCKED、TERMINATED),重点讲解了Java中的特殊状态及其转换,以及sleep()和wait()方法在Java虚拟机中的差异。
摘要由CSDN通过智能技术生成

操作系统线程状态和Java线程状态的区别与联系

操作系统

操作系统的线程有五种状态,它们分别是:新建态、就绪态、运行态、等待态、终止态

就绪态:资源齐全,处于可运行的状态

等待态:等待某一资源或锁的状态

操作系统线程状态图

Java虚拟机

Java虚拟机的线程分为六种状态,它们分别是:NEW、RUNNABLE、WAITING、TIMED_WAITING、BLOCKED、TERMINATED

RUNNABLE:Java虚拟机的Runnable态包含了操作系统的就绪态和运行态,也就是说,当Java虚拟机中有一个线程处于该状态时,它不仅仅可能处于运行态,它也可能处于一种需要某种资源的就绪态(比如IO资源)

WAITING:在Java虚拟机中,处于waiting态的线程必须要被其他线程给唤醒,notify()、notifyAll()方法均可唤醒处于waiting态的线程

Object.wait()、Thread.join()、LockSupport.park(),这三种方法都可以用来将一个线程设置为waiting状态。在操作系统中,处于等待态的线程是由于缺少某种资源或没有抢到锁等原因导致处于等待阻塞的一个状态。

TIMED_WAITING:超时等待态,Java虚拟机独有的状态,在超过某一时间之后,自动从超时等待态切换到RUNNABLE状态

调⽤如下⽅法会使线程进⼊超时等待状态:

Thread.sleep(long millis):使当前线程睡眠指定时间,只能使用interrupt()方法打断;

Object.wait(long timeout):线程休眠指定时间,等待期间可以通过notify()/notifyAll()唤醒;

Thread.join(long millis):等待当前线程最多执⾏millis毫秒,如果millis为0,则会⼀直执⾏;

LockSupport.parkNanos(long nanos): 除⾮获得调⽤许可,否则禁⽤当前线程进⾏线程调度指定时间;

LockSupport.parkUntil(long deadline):同上,也是禁⽌线程进⾏调度指定时间;

BLOCKED:在Java虚拟机中,处于该状态的线程必须等待锁的释放,才能进入同步区。

Java中线程状态转换图:

Java虚拟机中线程状态转换图

Java虚拟机中sleep()和wait()的区别

sleep()方法可以在任何场景下使用,而wait()方法只能在同步方法或同步代码块中使用

sleep()方法不释放锁,而wait()方法释放锁

sleep()方法会使线程处于TIMED_WAITING状态,而wait()方法会使线程处于WAITING状态

sleep()方法提前唤醒只能使用interrupt(),而wait()方法使用notify()或notifyAll()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值