- 浏览: 91509 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (148)
- 全文检索 (1)
- java (29)
- xml (2)
- json (2)
- redis springmvc (1)
- Redis (5)
- 开发常识 (1)
- tomcat (2)
- 单元测试Junit (2)
- 设计模式 (2)
- spring (10)
- jvm (2)
- eclipse (4)
- echart (1)
- mybatis (1)
- mysql (3)
- web (1)
- js (2)
- PL/SQL (2)
- 其他 (1)
- 人生 (1)
- 安全 (2)
- jsp (2)
- 硬件电脑 (1)
- linux (3)
- git (10)
- oracle (8)
- ant (1)
- maven (2)
- 正则表达式 (2)
- chrome (1)
- 面试 (6)
- 多线程 (19)
- bug (11)
- java工具类 (3)
- 算法 (1)
- bug,git (1)
- shell (2)
- springmvc (2)
- Java8 (1)
- 消息队列-rocketmq (1)
- es (1)
- dubbo (0)
- spring cloud (0)
- hashmap (0)
- springboot (1)
- velocity (0)
线程对象的生命周期
1.Thread.State类声明的线程状态
Thread.State 是Thread类的内部枚举类,其中声明6种线程状态,声明如下:
线程状态说明如下:
(1)新建态
new Thread()创建的线程对象处于新建态NEW,系统没有为它分配资源。
(2)运行态
从操作系统角度看,处于新建态的线程启动后,进入就绪态,再由操作系统调度执行而成为运行态。由于线程调度由操作系统控制和管理,程序无法控制,无法区分就绪态或运行态。所以,从程序设计角度看,线程启动后即进入运行态RUNNABLE。进入运行态的线程,执行其run()方法。
(3)阻塞态和等待状态
一个运行态的线程因某种原因不能继续运行时,进入阻塞态(BLOCKED)或等待态。处于阻塞态或等待态的线程不能执行,即使处理器空闲也不能执行。只有当引起阻塞的原因消除,或等待条件满足时,线程再转入运行态,重新进入线程队列排队等待运行,再次运行时将从暂停处继续运行。
导致线程进入阻塞态或等待态的原因有多种,如输入/输出、等待消息、睡眠、锁定等。等待态有两种WAITING和TIMED_WAITING,WAITING等待时间不确定,TIMED_WAITING等待时间确定。
(4)终止态
线程对象停止运行未被撤销时是终止态(TERMINATED)。导致线程终止有两种情况:运行结束或被强行停止。当线程的run()方法执行结束时,该线程进入终止态,等待系统撤销对象所占用的资源;当进程因故停止运行时,该进程中的所有线程将被强行终止。
2.Thread类中改变和判断线程状态的方法
Thread类中定义start()、sleep()、interrupt()等多个改变线程状态的方法,以及isAlive()、isInterrupted()等判断线程状态的方法。Java线程对象的状态及状态变化如下图:
(1)线程启动
start()方法启动已创建的线程对象,isAlive()方法判断线程是否活动状态,声明如下:
public void start() //启动已创建的线程对象
public final boolean isAlive() //判断线程是否活动状态
只有处于新建态的线程对象才能调用start()方法启动,一个线程只能启动一次,如果一个已启动的线程对象再次调用start()方法,则Java抛出IllegalThreadStateException异常。
当一个线程已启动且未被终止时,isAlive()方法返回true,此时该线程处于运行态、阻塞态、等待态之一,不能做进一步分辨;当一个线程未启动或已终止时,isAlive()方法返回false.
(2)线程睡眠
sleep()方法使当前线程停止执行若干毫秒,线程由运行态进入等待态,睡眠时间到时线程可再次进入运行态。sleep()方法声明如下,参数millis指定睡眠毫秒数。
public static void sleep(long millis) throws InterruptedException
(3)线程中断
interrupt()方法对当前线程设置运行中断标记,与之配合使用的还有两个判断线程是否中断的方法,声明如下:
public void interrupt() //设置当前线程对象运行中断标记
public boolean isInterrupt() //判断线程是否中断
interrupt()方法为当前线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep()之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,捕获这个异常进行中断处理操作。
注意:interrupt()方法只是为线程设置了一个中断标记,并没有中断线程运行,该方法没有抛出异常。一个线程在被设置了中断标记之后仍可运行,isAlive()返回true。实例方法isInterrupted()测试线程对象的中断标记,并不清除中断标记。
当抛出一个InterruptedException异常时,记录该线程中断情况的标记将会被清除,这样再调用isInterrupted()返回false。
1.Thread.State类声明的线程状态
Thread.State 是Thread类的内部枚举类,其中声明6种线程状态,声明如下:
public class Thread extends Object implements Runnable{ public static enum Thread.State extends Enum<Thread.State>{ public static final Thread.State NEW //新建态,已创建未启动 public static final Thread.State RUNNABLE //运行态,正在执行 public static final Thread.State BLOCKED //阻塞态,等待监控锁 public static final Thread.State WAITING //等待态,等待时间不确定 public static final Thread.State TIMED_WAITING //等待态,等待时间确定 public static final Thread.State TERMINATED //终止态 } public State getState() //返回线程的当前状态 }
线程状态说明如下:
(1)新建态
new Thread()创建的线程对象处于新建态NEW,系统没有为它分配资源。
(2)运行态
从操作系统角度看,处于新建态的线程启动后,进入就绪态,再由操作系统调度执行而成为运行态。由于线程调度由操作系统控制和管理,程序无法控制,无法区分就绪态或运行态。所以,从程序设计角度看,线程启动后即进入运行态RUNNABLE。进入运行态的线程,执行其run()方法。
(3)阻塞态和等待状态
一个运行态的线程因某种原因不能继续运行时,进入阻塞态(BLOCKED)或等待态。处于阻塞态或等待态的线程不能执行,即使处理器空闲也不能执行。只有当引起阻塞的原因消除,或等待条件满足时,线程再转入运行态,重新进入线程队列排队等待运行,再次运行时将从暂停处继续运行。
导致线程进入阻塞态或等待态的原因有多种,如输入/输出、等待消息、睡眠、锁定等。等待态有两种WAITING和TIMED_WAITING,WAITING等待时间不确定,TIMED_WAITING等待时间确定。
(4)终止态
线程对象停止运行未被撤销时是终止态(TERMINATED)。导致线程终止有两种情况:运行结束或被强行停止。当线程的run()方法执行结束时,该线程进入终止态,等待系统撤销对象所占用的资源;当进程因故停止运行时,该进程中的所有线程将被强行终止。
2.Thread类中改变和判断线程状态的方法
Thread类中定义start()、sleep()、interrupt()等多个改变线程状态的方法,以及isAlive()、isInterrupted()等判断线程状态的方法。Java线程对象的状态及状态变化如下图:
(1)线程启动
start()方法启动已创建的线程对象,isAlive()方法判断线程是否活动状态,声明如下:
public void start() //启动已创建的线程对象
public final boolean isAlive() //判断线程是否活动状态
只有处于新建态的线程对象才能调用start()方法启动,一个线程只能启动一次,如果一个已启动的线程对象再次调用start()方法,则Java抛出IllegalThreadStateException异常。
当一个线程已启动且未被终止时,isAlive()方法返回true,此时该线程处于运行态、阻塞态、等待态之一,不能做进一步分辨;当一个线程未启动或已终止时,isAlive()方法返回false.
(2)线程睡眠
sleep()方法使当前线程停止执行若干毫秒,线程由运行态进入等待态,睡眠时间到时线程可再次进入运行态。sleep()方法声明如下,参数millis指定睡眠毫秒数。
public static void sleep(long millis) throws InterruptedException
(3)线程中断
interrupt()方法对当前线程设置运行中断标记,与之配合使用的还有两个判断线程是否中断的方法,声明如下:
public void interrupt() //设置当前线程对象运行中断标记
public boolean isInterrupt() //判断线程是否中断
interrupt()方法为当前线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep()之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,捕获这个异常进行中断处理操作。
注意:interrupt()方法只是为线程设置了一个中断标记,并没有中断线程运行,该方法没有抛出异常。一个线程在被设置了中断标记之后仍可运行,isAlive()返回true。实例方法isInterrupted()测试线程对象的中断标记,并不清除中断标记。
当抛出一个InterruptedException异常时,记录该线程中断情况的标记将会被清除,这样再调用isInterrupted()返回false。
发表评论
-
ThreadPoolExecutor线程池参数详解
2019-01-09 00:06 478参考:https://www.cnblogs.com/wayt ... -
解决线程同步问题的思路
2018-07-31 16:35 418线程同步机制 操作系统中实现线程同步有一种工 ... -
发送线程与接收线程 速率一致
2018-08-07 09:17 384package com.jbx.xiezuo; /* ... -
线程间的协作关系与线程同步
2018-07-30 16:21 5291.线程间的协作关系 当一个进程中的多个线程为完成同 ... -
带互斥锁的并发线程执行流程
2018-07-30 12:38 449... -
线程间的竞争关系与线程互斥
2018-07-30 11:19 672线程间的竞争关系与线 ... -
线程的同步机制
2018-07-17 11:31 385线程的同步机制 (一) ... -
3个线程,A,B,C,这三个线程分别只能打印 “a”,“b”,“c”,怎么让这三个线程依次打印“abc"
2018-07-17 11:19 351package com.jbx.thread; /* ... -
定时器与图形动画设计
2018-07-17 11:15 0动画(animation) 都是利用人眼的视 ... -
线程分类
2018-07-17 09:10 325线程分类: 线程可分为用户线程(user thread) ... -
线程优先级
2018-07-17 09:08 359Java提供10个等级的线程优先级,分别用1~10表示,优先级 ... -
设计滚动字演示线程状态及改变方法
2018-07-16 16:17 304本例演示线程对象的生 ... -
声明实现Runnable接口的奇数/偶数序列线程
2018-07-11 14:02 428package com.jbx.thread; ... -
声明继承Thread类的奇数/偶数序列线程
2018-07-10 23:58 420package com.jbx.com; /** ... -
Java的线程对象Runnable接口和Thread类
2018-07-10 21:42 400Java支持内置的多线程机制。 Java语言包中的Runnab ... -
并发程序设计
2018-07-09 17:22 276并发程序设计 1.顺序程 ... -
线程介绍
2018-07-09 16:55 298线程 1.引入线程机制的 ... -
进程介绍
2018-07-09 15:38 378进程 进程的定义和属性 进程是一个可并发执行的 ... -
多线程
2018-07-09 14:31 313...
相关推荐
### Java多线程之线程的生命周期和状态控制 #### 一、线程的生命周期 在Java中,线程的生命周期是指线程从创建到结束的整个过程。根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建...
新建阶段是指创建一个新的线程对象,但还没有启动。就绪阶段是指线程已经被创建,但还没有被执行。运行阶段是指线程正在被执行。阻塞阶段是指线程被阻塞,不能继续执行。死亡阶段是指线程已经执行完毕或被终止。 ...
当通过`new Thread()`创建一个线程对象时,线程处于新建状态。此时,它只是一个普通的Java对象,尚未开始执行任何线程任务。要使线程开始运行,需要调用`start()`方法。 2. 就绪(Runnable): 调用`start()`方法后...
Java线程的生命周期是编程中一个关键的概念,尤其是在多线程编程中。线程的生命周期主要包括以下几个阶段: 1. **创建**:线程的创建可以通过两种方式:直接实例化Thread类或者继承Thread类并重写run()方法。例如,...
在探讨Java多线程和线程生命周期时,我们首先应该明确,Java多线程是Java语言支持并发编程的一个重要特性,其允许同时执行多个任务,以提高程序的执行效率和改善用户体验。Java中的每个线程都有自己的生命周期,由一...
当我们使用`Thread`类创建一个新的线程对象时,线程处于新建状态。例如,通过`new Thread()`构造函数创建线程。此时,线程尚未启动,只是在内存中占有了一个位置。 2. **就绪状态**(Runnable): 使用`start()`...
在Java虚拟机(JVM)中,对象的生命周期包含了多个阶段,这些阶段共同决定了一个对象从诞生到消亡的过程。以下是这些阶段的详细介绍: **创建阶段(Creation)** 在这个阶段,对象从无到有,主要经历以下几个步骤:...
Java 线程的生命周期完整实例分析 Java 线程的生命周期是指线程从创建到销毁的整个过程。Java 中的线程生命周期主要包括以下几个阶段:新建(New)、可运行(Runnable)、运行(Running)、等待(Waiting)、阻塞...
当使用`Thread`类创建一个线程对象时,线程处于新建状态。例如,在示例代码中创建了`LifeCycle`类的一个实例`thread1`,此时线程还没有开始执行,`isAlive()`方法返回`false`。 2. **就绪(Runnable)**: 当调用...
《深入理解TAO对象生命周期服务:基于CORBA的实践解析》 在分布式计算环境中,CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)作为一种标准,为跨平台的对象间交互提供了强大的支持...
1. **新建状态 (New)**:当通过`new Thread()`创建一个新的线程对象时,线程处于新建状态。此时,线程尚未启动,需要调用`start()`方法才能将线程放入就绪队列。 2. **就绪状态 (Runnable)**:当调用了线程的`start...
当通过`Thread`类创建一个新的线程对象时,它处于新建状态。此时,线程尚未启动,只是存在于内存中。要启动线程,必须调用`start()`方法,这将触发`run()`方法的执行。 2. 就绪(Runnable): 调用`start()`方法后...
1. **新建(New)**:当通过`Thread`类的构造函数创建一个线程对象时,线程处于新建状态。此时,线程尚未启动,只是内存中存在了一个线程实例。 2. **可运行(Runnable)**:当调用线程的`start()`方法后,线程进入...
本文将深入探讨Java线程的生命周期,包括创建、启动、结束以及线程的协作和调度。 首先,创建Java线程有两种主要方式:直接实例化`Thread`类或者创建一个新的类去继承`Thread`类并重写`run()`方法。例如,你可以...
### Java软件开发实战:线程的生命周期 #### 线程生命周期的概念 在Java软件开发过程中,线程是实现并发的重要手段之一。了解线程的生命周期对于有效地管理和控制线程至关重要。线程从创建到销毁的过程可以分为多...
1. **新建状态**:当使用`new Thread()`创建一个线程对象时,线程处于新建状态。此时,线程尚未开始执行。 2. **就绪状态**:当线程调用了`start()`方法,线程进入就绪队列等待JVM分配CPU时间片,准备执行。 3. **...
"Java线程的生命周期和状态控制" Java线程的生命周期是指从线程创建到线程结束的整个过程,而状态控制是指线程在不同的状态之间的转换。Java线程的生命周期主要包括五个状态:新建状态、就绪状态、运行状态、阻塞...
Java线程的生命周期和状态控制是Java多线程编程中的核心概念。线程的状态转换是理解线程行为的关键,这包括新建状态、就绪状态、运行状态、阻塞状态和死亡状态。 1. 新建状态:当使用`new`关键字创建了一个`Thread`...
Java对象生命周期管理是Java开发中不可或缺的一个重要环节。在Java编程中,对象的创建、使用和销毁是由垃圾收集器自动管理的。理解这一过程对于优化应用程序性能至关重要,因为不恰当的对象管理可能导致内存泄漏,...
Java线程的生命周期详解 Java线程的生命周期是多线程编程中一个非常重要的概念,理解线程的生命周期可以帮助开发者更好地掌握Java多线程编程。下面是Java线程的生命周期的详解: 一、线程的状态 Java线程的生命...