今天有同事问到线程的问题,自己突然就有点蒙了,只模糊的记得个大概。
当初学习线程的时候把这7个状态记得比自己名字还熟悉
还把这7个状态编成了一段凄惨而美丽的爱情故事
没想到如今却只能记得个大概
真验证了“好记性不如烂笔头”的真理
还是赶快回忆一下吧
先从图片开始
小小的作下解释:
1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;
2、当该对象调用了start()方法,就进入可运行状态;
3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
4、进入运行状态后情况就比较复杂了
4.1、run()方法或main()方法结束后,线程就进入终止状态;
4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;
4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;
4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。
总算全部回忆了一遍JDK1.5在API的使用上有了较好的改进,效率得到很大的提高,不过几个状态转换的原理还是一样。
转自:itniwo
分享到:
相关推荐
在Java虚拟机中,线程状态的转换是严格控制的,每个状态转换都对应于特定的线程行为和线程调度决策。理解线程状态以及这些状态之间的转换机制,有助于开发者在设计多线程程序时作出更为合理的决策,以提高程序的性能...
2. **线程状态**:线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。线程的状态转换是由操作系统调度决定的。 3. **线程同步**:为了解决多个线程共享...
线程有多种状态,这些状态之间可以相互转换,了解这些状态对于我们编写高效的多线程程序非常重要。 新建状态(New) 在 Java 中,当我们创建一个线程对象时,它首先处于新建状态。在这个状态下,线程对象已经被...
本文将详细介绍Java多线程的基本概念、线程的生命期、线程的状态转换、线程调度原则以及如何实现线程的两种常见方式。 #### 二、线程的相关概念 **1. 进程与线程的区别** - **进程**:是一个正在执行的程序实例,...
了解这些状态及其转换对于理解和控制线程行为至关重要。 4. **线程同步**:为了解决多线程环境下的数据安全问题,Java提供了synchronized关键字,用于实现线程同步,防止数据竞争。此外,还可以使用Lock接口和相关...
3. **线程状态**:Java中的线程有五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。理解这些状态以及它们之间的转换是分析多线程问题的关键。 4. **同步机制**:...
- 死锁:两个或更多线程相互等待对方释放资源,导致所有线程都无法继续。 - 活锁:线程不断重试导致的无限期等待状态,类似死锁但线程未停止。 - 资源饥饿:低优先级线程长时间无法获取资源。 理解并解决这些问题...
一些常用的工具,如JVisualVM、JConsole或Java Mission Control (JMC),可以帮助我们监控线程状态,找出问题所在。 在文件列表中提到的“监控线程”,可能是指用于监视应用程序中线程行为的工具或代码片段。这些...
死锁是两个或多个线程相互等待对方释放资源而陷入的一种僵局。避免死锁的关键在于合理设计线程对资源的请求顺序和释放顺序。 10. 守护线程(Daemon Thread): 守护线程是一种特殊类型的线程,它不阻碍程序的退出...
通过调用start()方法将线程从新建状态转换为就绪状态,由JVM调度进入运行状态。线程可能会因I/O操作或锁的获取而进入阻塞状态,当任务完成或遇到异常则进入终止状态。 3. **线程同步** - **synchronized关键字**:...
线程状态的转换是由操作系统的调度器控制的。 3. **线程优先级**:每个线程都有一个优先级,操作系统会优先考虑高优先级的线程。C#中,线程优先级通过`Priority`属性设置,可以是`Lowest`、`BelowNormal`、`Normal`...
理解这些状态以及它们之间的转换对于调试和优化多线程程序至关重要。 3. **线程同步**:由于多个线程可能访问同一块数据,如果不加以控制,可能会导致数据不一致。为此,Java提供了`synchronized`关键字、`wait()`,...
Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。这些状态之间的转换是通过调用特定的方法,如start()、sleep()、join()、wait()、notify()等...
线程状态的转换过程可以用图形来表示,RUNNABLE状态是可以相互转换的,其转换过程如下图所示。RUNNABLE状态可以分成Runnable和Running两个状态,Runnable状态是线程已经准备好执行,但是还没有获得时间片,Running...
了解这些状态以及如何在它们之间转换是理解多线程的关键。 - **线程同步**:为了避免线程间的竞态条件,Java提供了`synchronized`关键字,它可以锁定代码块或方法,确保同一时间只有一个线程访问。 2. **线程池** ...
二、线程状态 Java中的线程有五种状态:新建(New)、就绪(Runnable)、运行(Running)、等待/阻塞(Blocked)、终止(Terminated)。了解这些状态以及它们之间的转换对于理解多线程的执行流程非常重要。 三、...
3. **线程状态**:Java线程有五种基本状态:新建、就绪、运行、阻塞和死亡。理解这些状态转换对于线程管理至关重要。 4. **同步机制**:为了解决多线程环境中的数据安全问题,Java提供了synchronized关键字,它可以...
#### 四、Java线程状态的转换 - **线程状态**: - Java线程有多种状态:新建 (`NEW`)、就绪 (`RUNNABLE`)、阻塞 (`BLOCKED`)、等待 (`WAITING`)、超时等待 (`TIMED_WAITING`) 和终止 (`TERMINATED`)。 - **状态...
线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)和终止(Terminated)六种状态。电梯线程在处理请求时会经历这些状态的转换。 9. **日志与调试**: 在MyElevator程序中...