小小的作下解释:
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()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。
转自:http://www.blogjava.net/liver/archive/2009/06/04/279924.html
- 大小: 53.3 KB
分享到:
相关推荐
在Java中,线程的状态主要包括以下几种: 1. **新状态(New)**:当一个线程对象刚刚创建出来,但还未启动,即`start()`方法尚未被调用时,线程处于新状态。 2. **可运行状态(Runnable)**:当线程对象调用了`start...
每个应用程序的模块都有自己的状态信息,主要包括以下几部分: - **Windows实例句柄**:用于加载资源。 - **指向当前`CWinApp`或`CWinThread`对象的指针**:这有助于管理应用程序级别的资源。 - **OLE模块的引用...
Delphi中的线程状态主要有以下几个: - **创建(Created)**:线程被创建但尚未开始执行。 - **就绪(Ready)**:线程已分配到CPU资源,等待执行。 - **运行(Running)**:线程正在执行。 - **等待(Waiting)...
3. 运行状态(Running):当线程调度器选择一个可运行状态的线程并将其分配给CPU执行时,线程进入运行状态。这是线程实际执行代码的状态。 4. 等待/阻塞/睡眠状态(Blocked/Waiting/Timed Waiting):这些状态统称...
4. **等待/阻塞/睡眠状态**:这三个状态合称为非运行状态。线程在此状态下虽然活着,但不能立即执行。例如,线程可能在等待锁、等待条件变量、调用`Thread.sleep()`或等待I/O操作完成。一旦等待条件满足,线程将返回...
线程在Java中由`java.lang.Thread`类表示,其生命周期包括以下几种状态: 1. **新建**(New):当使用`new Thread()`创建了一个线程对象时,线程处于新建状态。 2. **可运行**(Runnable):调用`start()`方法后,...
这个状态也可以通过调用`join()`方法等待另一个线程完成来进入。 6. 超时等待状态(Timed Waiting) 类似于等待状态,但线程会等待一定的时间。例如,调用`Object.wait(long timeout)`或`Thread.sleep(long timeout...
根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建状态**: - 当我们使用`new`关键字和`Thread`类或其子类建立一个线程对象时,该线程对象就处于新建状态。 - 此时,线程尚未开始运行...
如果线程被挂起,其值会是这个状态。此外,`ContextSwitchCount`字段可以提供额外的线索,当线程被挂起时,它的上下文切换次数通常不会增加。 在实际编程中,使用`NtQuerySystemInformation`需要处理以下几点: 1. ...
本文将详细讲解Java中线程的几个关键方法及其应用场景。 1. `run()`方法 `run()`方法是线程执行的主要逻辑所在。当创建一个线程并调用`start()`方法时,Java虚拟机(JVM)会自动调用`run()`方法。`run()`方法必须是`...
标题 "C#线程相关几个小程序" 涉及到的是C#编程语言中的多线程技术,这是软件开发中非常关键的一个部分,特别是在需要同时处理多个任务或提高程序响应速度时。C#提供了丰富的线程支持,让我们来详细探讨一下相关知识...
在MFC中,线程间通信可以通过几种方式实现: 1. 消息队列:使用PostThreadMessage函数向其他线程发送消息。 2. 事件对象:利用CEvent类创建事件,等待或通知其他线程。 3. 互斥量:通过CMutex类实现资源的互斥访问。...
线程通常经历以下几个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。在Java中,这些状态对应于`Thread.State`枚举类型,而在Python中,虽然没有明确的状态枚举,但...
这个状态下是指线程拥有了某个锁之后,调用了它的wait方法,或者线程调用了join方法 join了另外的线程,等待被他join的线程执行结束的状态。这里要区分阻塞状态和等待状态的区别,一个是在临界点外面等待进入,一个...
### Java多线程几个核心概念 #### 一、理解多线程 多线程是一种让程序内部的不同任务或计算能够并发执行的技术。在Java中,多线程的应用极为广泛,可以大大提高程序的效率和响应性。多线程的核心概念包括以下几个...
在Java虚拟机中,线程状态的转换是严格控制的,每个状态转换都对应于特定的线程行为和线程调度决策。理解线程状态以及这些状态之间的转换机制,有助于开发者在设计多线程程序时作出更为合理的决策,以提高程序的性能...
这个状态是线程生命周期的开始阶段,当线程对象被创建后,它就处于这个状态中。 可运行状态(Runnable) 当线程对象被创建后,我们可以调用它的 start() 方法来启动线程。在调用 start() 方法后,线程对象将进入可...
2. **条件变量(Condition)**:条件变量允许线程在满足特定条件时进入等待状态,当条件满足时唤醒等待的线程。Java的`java.util.concurrent.Condition`和Python的`threading.Condition`都提供了这个功能。 3. **...
线程在其生命周期中会经历以下几种状态:新建、就绪、运行、阻塞和死亡。 1. **新建**:创建了一个新的线程对象。 2. **就绪**:调用`start()`方法后,线程处于可运行状态,等待CPU时间片。 3. **运行**:线程获得...