JAVA线程转换

线程状态

1. 线程状态分类及转换

线程状态可分为六态或者七态

  • 六态:New(新建状态)、Runnable(可运行状态)、Terminated(终止状态)、Waiting(等待状态)、TimedWaiting(超时等待状态)、Blocked(阻塞状态)
  • 七态:New(新建状态)、Ready(就绪状态)、Running((运行状态)、Terminated(终止状态)、Waiting(等待状态)、TimedWaiting(超市等待状态)、Blocked(阻塞状态)

线程状态转换图:

在这里插入图片描述

2.线程状态

  • New(新建状态):

    通过实现Runnable接口或者继承Thread声明一个线程类,new一个实例之后,线程进入新建状态。

  • Ready(就绪状态):

    线程对象创建成功后,调用该线程的start()函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取CPU的使用权。

  • Running(可运行状态):

    此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。(即线程获取到了cpu时间片)。当线程时间片用完或调用的yield()函数,该线程回到就绪状态。

  • Terminated(终止状态)

    线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。线程终止后就不能复生了。

  • Waiting(等待状态)

    运行状态的线程执行wait()与join()函数会让JVM把该线程放入锁等待队列。处于这种状态的线程不会被分配cpu执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。

    唤醒线程可以通过执行LockSupport.unpark(t)函数唤醒指定线程,该线程回到就绪状态。

    而通过notify()、notifyAll()、join线程执行完毕方式,会唤醒锁等待队列的线程,出现的线程回到就绪状态。

  • TimedWaiting(超时等待状态)

    超时等待状态(Timed waiting)超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。

    wait(long)、join(long)、LockSuport.parkNanos(long)、LockSuport.parkUtil(long)、sleep(long)等函数会触发超时等待状态。

    wait(long)、join(long)函数会让JVM把线程放入锁等待队列。

    超时时间到了,则会进行自动唤醒,后续过程则和等待状态相同。

  • Blocked(阻塞状态)

    运行状态的线程获取同步锁失败或发出I/O请求,该线程进入阻塞状态。

    如果是获取同步锁失败JVM还会把该线程放入锁的同步队列。

    同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。I/O处理完毕时,该线程重新回到就绪状态。

在这里插入图片描述
参考:公众号:编程技术进阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值