操作系统与Java中线程的生命周期和线程状态

1 操作系统中的线程状态

  • 创建:线程从创建到被cpu执行之前的这个阶段。
  • 就绪:指线程已具备各种执行条件,一旦获取cpu便可执行。
  • 运行:表示线程正获得cpu在运行。
  • 阻塞:指线程在执行中因某件事而受阻,处于暂停执行的状态,阻塞的线程不会去竞争cpu。
  • 终止:线程执行完毕,接下来会释放线程占用的资源。

线程的生命周期图如下(进程与线程生命周期一样):

2 Java中线程的状态

Thread类中维护类一个内部枚举类State,里面是线程的状态,属性如下:

  • NEW:表示未启动的线程。
  • RUNNABLE:表示线程正在JVM中执行,但执行的动作也可能是“等待”:等待操作系统的某些资源如处理器。
  • BLOCKED:表示线程正在等待一个锁去进入某个同步方法或同步代码块。
  • WAITING:表示因为调用接下来的方法,线程正在等待。包括:Object.wait()、Thread.join()和LockSupport.part()。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(),需要另外一个线程调用Object.notify()或Object.notifyAll()。
  • TIMED_WAITING:表示线程因为调用接下来的方法,线程正在等待,等待时间最多为一个具体的值。包括:Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)和LockSupport.parkUntil(time)。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(3000),另外一个线程调用Object.notify()或Object.notifyAll()可以使该线程退出等待状态。
  • TERMINATED:表示一个终止的线程,这个线程的执行已经完成。

生命周期图如下,下面红色字体是操作系统中对应Java中的线程状态:

两个队列

等待队列

WAITING和TIMED_WAITING状态的线程会被放到等待队列中,等待队列中的线程只有其它线程调用特殊动作(如:notify/notifyAll)才会从等待队列移到阻塞队列。

阻塞队列

阻塞队列中的线程会一直阻塞,直到获取锁的线程释放了锁,此时OS会从阻塞队列中选择一个线程执行。

类似于操作系统中的记录型信号量,信号量维持了int变量(锁状态)和阻塞队列(获取该信号量失败的线程队列),java中Block状态的线程都是阻塞线程,这些线程都会挂到阻塞队列上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值