网站首页 > 精选教程 正文
1、NEW状态
通过 new Thread(…)已经创建线程,但尚未调用start()启动线程,该线程处于 NEW(新建)状态。虽然前面介绍了4种方式创建线程,但是其中的其他三种方式,本质上都是通过new Thread() 创建的线程,仅仅是创建了不同的 target 执行目标实例(如 Runnable 实例)。
2、RUNNABLE 状态
Java把就绪(Ready)和执行(Running)两种状态合并为一种状态:可执行(RUNNABLE)状态(或者可运行状态)。调用了线程的 start() 实例方法后,线程就处于就绪状态;此线程获取到 CPU 时间片后,开始执行 run()方法中的业务代码,线程处于执行状态。
2.1、就绪状态:
就绪状态仅仅表示线程具备运行资格,如果没有被操作系统的调度程序挑选中,线程就永远是就绪状态;当前线程进入就绪状态的条件,大致包括以下几种:
- 调用线程的 start()方法,此线程进入就绪状态。
- 当前线程的执行时间片用完。
- 线程睡眠(sleep)操作结束。
- 对其他线程合入(join)操作结束。
- 等待用户输入结束。
- 线程争抢到对象锁(Object Monitor)。
- 当前线程调用了 yield 方法出让 CPU 执行权限。
2.2、执行状态
线程调度程序从就绪状态的线程中选择一个线程,作为当前线程时线程所处的状态。这也是线程进入执行状态的唯一方式。
3、BLOCKED状态
处于阻塞(BLOCKED)状态的线程并不会占用 CPU 资源,以下情况会让线程进入阻塞状态:
3.1、线程等待获取锁
等待获取一个锁,而该锁被其他线程持有,则该线程进入阻塞状态。当其他线程释放了该锁,并且线程调度器允许该线程持有该锁时,该线程退出阻塞状态。
3.2、IO阻塞
线程发起了一个阻塞式IO操作后,如果不具备IO操作的条件,线程会进入阻塞状态。IO包括磁盘IO、网络IO等。IO阻塞的一个简单例子:线程等待用户输入内容后继续执行。
4、WAITING状态
处于 WAITING(无限期等待)状态的线程不会被分配 CPU 时间片,需要被其他线程显式地唤醒,才会进入就绪状态。线程调用以下 3 种方法,会让自己进入无限等待状态:
- Object.wait()方法,对应的唤醒方式为:Object.notify() / Object.notifyAll()。
- Thread.join()方法,对应的唤醒方式为:被合入的线程执行完毕。
- LockSupport.park()方法,对应的唤醒方式为:LockSupport.unpark(Thread)。
5、TIMED_WAITING状态
处于 TIMED_WAITING(限时等待)状态的线程不会被分配 CPU 时间片,如果指定时间之内没有被唤醒,限时等待的线程会被系统自动唤醒,进入就绪状态。以下 3 个方法会让线程进入限时等待状态:
- Thread.sleep(time)方法,对应的唤醒方式为:sleep睡眠时间结束。
- Object.wait(time)方法,对应的唤醒方式为:调用 Object.notify()/Object.notifyAll()去主动唤醒,或者限时结束。
- LockSupport.parkNanos(time)/parkUntil(time)方法,对应的唤醒方式为:线程调用配套的 LockSupport.unpark(Thread)方法结束,或者线程停止(park)时限结束。
进入 BLOCKED 状态、WAITING 状态、TIMED_WAITING 状态的线程都会让出CPU的使用权;另外,等待或者阻塞状态的线程被唤醒后,进入Ready状态,需要重新获取时间片才能接着运行。
6、TERMINATED状态
线程结束任务之后,将会正常进入TERMINATED(死亡)状态;或者说在线程执行过程中发生了异常(而没有被处理),也会导致线程进入死亡状态。
摘自:《Java高并发核心编程(卷2)》
猜你喜欢
- 2024-11-20 下次面试再一上来就问我线程有哪些状态,我上去就是给他一 jio
- 2024-11-20 Java线程状态的转换
- 2024-11-20 Java 线程的生命周期及状态详解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)