Java线程状态

线程跟人类一样拥有自己的生命周期,一条线程从创建到执行完毕的过程即是线程的生命周期,此过程可能在不同时刻处于不同的状态,线程状态正是这小节的主题,线程到底有多少种状态?不同状态之间是如何转化的?

对于线程的状态的分类并没有严格的规定,只要能正确表示状态即可,如图2-5-7-1,先看其中一种状态分类,一个线程从创建到死亡可能会经历若干个状态,但在任意一个时间点线程只能处于其中一种状态,总共包含五个状态:新建(new)、可运行(runnable)、运行(running)、非可运行(not runnable)、死亡(dead)。线程的状态的转化可以由程序控制,通过某些API可以达到转化效果,例如Thread类的start、stop、sleep、suspend、resume、wait、notify等方法(stop、suspend、resume等方法因为容易引起死锁问题而早已被弃用)。

图2-5-7-1

l   新建(new):一个线程被创建了但未被启动就处于新建状态,即在程序中使用new MyThread();创建的线程实例就处于此状态。

l   可运行(runnable):创建的线程实例调用start()方法后便进入可运行状态,处于此状态的线程并不是说一定处于运行状态,我们在上一节多线程调度策略了解到Java多线程使用的是抢占式调度,每个可运行线程轮着获取CPU时间片,可以虚拟想象成有一个可运行线程池,start()方法把线程放进可运行线程池中,CPU按一定规则一个个执行池里的线程。

l   运行(running):当可运行线程获取到CPU执行时间片即进去了运行状态。

l   非可运行(notrunnable):运行中的线程因某种原因暂时放弃CPU的使用权,可能是因为执行了挂起、睡眠或等待等操作,在执行I/O操作时由于外部设备速度远低于处理器速度也可能导致线程暂时放弃CPU使用权,在获取对象的同步锁过程中如果同步锁先被别的线程占用同样可能导致线程暂时放弃CPU。

l   死亡(dead):线程执行完run()方法实现的任务,或因为异常导致退出任务,线程进入死亡状态后将不可再转换成其他状态。

将非可运行(not runnable)状态继续细分,如图2-5-7-2,新建、可运行、运行、死亡四个状态的定义和转化与前面的一样,重点看非可运行状态引申出来的三个状态:阻塞(blocked)、同步锁(locked)、等待(waiting)。

l   阻塞(blocked):阻塞由阻塞事件触发,线程处于阻塞状态将放弃CPU的使用权,暂时停止运行。一般线程执行了sleep()、join()方法,或发出了I/O请求,线程就将处于阻塞状态,假如sleep()执行的睡眠结束、join()执行的等待中断超时、I/O请求结束,则将重新回到可执行状态,等待分配CPU。

l   同步锁(locked):假如一个线程准备调用一个同步方法,而同步方法对应的对象正被其他线程占用,此时线程就将进入同步锁状态。实际上,Java中的每个object对象都有一个monitor,此monitor负责对同步域在并发时的独占处理,即一个线程调用某对象的同步方法时,JVM将检测改对象的monitor是否已被占用,如果没有被占用,线程则得到monitor占有权,继续执行该对象的同步方法,否则线程将被扔进一个等待线程队列排队,直到monitor被释放后,所有等待的线程继续竞争monitor占有权,抢到monitor占有权后才进入可执行状态等待CPU的分配,才有资格执行同步方法。

l   等待(waiting):运行中的线程执行了wait()方法后就进入等待状态。一个对象执行了wait()方法同样将使线程进入该对象的等待线程队列,同时它还将释放对象锁,即放弃monitor的占有权。只有在其他线程中对该对象调用notify()、notifyAll()方法时才会唤醒等待线程队列中的线程,notify是随机唤醒等待队列中的一个线程,而nofityAll则是唤醒所有等待队列中的线程,所有线程被唤醒后将对该对象的monitor占有权竞争,获取到占有权的线程才能转化为可执行状态,等待分配CPU往下执行,其他线程则继续等待。

图2-5-7-2

时间: 2024-12-27 18:47:39

Java线程状态的相关文章

Java线程状态及Thread类中的主要方法

要想实现多线程,就必须在主线程中创建新的线程对象. 任何线程一般具有5种状态,即创建,就绪,运行,阻塞,终止. 创建状态: 在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时,他已经有了相应的内存空间和其他资源,但还处于不可运行状态. 就绪状态: 新建线程对象后,调用该线程的start()方法可以启动线程.当线程启动时,线程进入就绪状态.此时,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件.-------(运行start()方法只是进入就绪状态,并没有开

Java线程状态的改变

一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态.这也是线

学习java线程状态和看懂thread dump文件中的线程信息

线程的状态是一个很重要的东西,因此thread dump中会显示这些状态,通过对这些状态的分析,能够得出线程的运行状况,进而发现可能存在的问题.线程的状态在Thread.State这个枚举类型中定义: public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runn

关于Java线程状态

线程状态说明 线程状态定义在Thread.State枚举中,以下内容取自Thread.java源码 NEW: 线程尚未开始 A thread that has not yet started is in this state. RUNNABLE: 线程可运行,但可能未分配到处理器 A thread executing in the Java virtual machine is in this state. BLOCKED: 线程等待monitor锁 A thread that is block

Java线程状态、线程停止、线程阻塞

线程状态(五种状态) Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡5 个状态.一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 . 创建状态 (New Thread) 在 Java 语言中使用 new操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态. 就绪状态 (Runnable) 使用 start()方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,

谈谈 Java 线程状态相关的几个方法

http://blog.jrwang.me/2016/java-thread-states/ 发表于 2016-07-23 在 Java 多线程编程中,sleep(), interrupt(), wait(), notify() 等方法是非常基本也很常用的方法.这些方法会改变运行中的 Java 线程的状态,正确地认识这些方法是掌握 Java 并发编程的基本要求. Java 线程的状态 先来谈一谈 Java 中线程的状态.在 Java 中,线程的状态和底层操作系统中线程的状态并不是一一对应的关系,

Java线程状态的转换

Java线程:线程状态的转换 一.线程状态 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态.这也是线程进入运行状态的唯一一种方式. 4.等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态.

Java 线程状态

1. 线程状态类型  1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权.3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码.4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:(一).等待阻塞:运行的线程执行wai

java线程状态及转换

java线程有6种状态: 新建线程new,启动线程runnable,阻塞block,限时等待timed_waiting,等待线程waiting,终止线程terminated 1.限时等待timed waiting :处于这种状态的线程不会被分配cpu执行时间.不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒.以下方法会让线程进行限时等待状态: a.  Thread.sleep()方法; b.  设置了Timeout参数的Object.wait()方法; c.  设置了Time