IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java并发编程(二)—— 线程的状态 -> 正文阅读

[Java知识库]Java并发编程(二)—— 线程的状态

线程的六个状态:创建、就绪、运行、等待、阻塞以及死亡

  • 创建状态:在生成线程对象之后,调用该对象的start()方法之前,线程处于创建状态;
  • 就绪状态:当线程对象调用了start()方法之后,该线程就进入了就绪状态,但是CPU还未调度这个线程执行任务,此时的线程就处于就绪状态。并且在线程开始运行之后,从等待或者睡眠中被激活之后,也会处于就绪状态;
  • 运行状态:处于就绪状态的线程被CPU调度,此时线程转为运行状态,开始运行run()方法当中的代码。
  • 等待状态/等待超时状态(主动进入):调用wait()方法,线程进入等待状态。调用notify()/notifyAll()方法会唤醒线程,使线程从等待状态进入就绪状态或者运行状态。等待状态是没有时间戳的,如果没有被唤醒,会一直等待下去。另外,可以限定等待时间—wait(time),如果时间到了,即便是没有被唤醒,也会从等待状态恢复到就绪状态或运行状态。调用sleep(time)会进入等待超时状态;
  • 阻塞状态(被动进入):通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行(由运行状态转为阻塞状态)。比如,当前线程调用了同步方法,即synchronized修饰的代码块或方法,如果没有拿到锁,就会进入阻塞状态,重新获取到锁,就会重新进入运行状态;
  • 死亡状态:如果一个线程的run()方法执行结束或者调用stop()方法后,该线程就会死亡。对于已经死亡的线程,就无法再使用start()方法令其进入就绪;
// Thread.java
public enum State {
    NEW, // 线程已创建,但还没有start
    RUNNABLE, // 处于可运行状态,一切就绪
    BLOCKED, // 处于阻塞状态,比如等待某个锁的释放
    WAITING, // 处于等待状态
    TIMED_WAITING, // 等待特定的时间
    TERMINATED; // 终止运行
}

Java线程状态变迁如图所示:

Java线程状态变迁

从图中可以看到,线程创建之后,调用start()方法开始运行。当线程执行wait()方法之 后,线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。线程在执行Runnable.run()的方法之后将会进入到终止状态。

注意:Java将操作系统中的运行和就绪两个状态合并称为运行状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为java.concurrent包中Lock接口对于阻塞的实现均使用了LockSupport类中的相关方法。

通过以下代码运行时的线程信息,更加深入地理解线程状态:

public class ThreadState {

  public static void main(String[] args) {
    new Thread(new TimeWaiting(), "TimeWaitingThread").start();
    new Thread(new Waiting(), "WaitingThread").start();
    // 使用两个Blocked线程,一个获取锁成功,另一个被阻塞
    new Thread(new Blocked(), "BlockedThread-1").start();
    new Thread(new Blocked(), "BlockedThread-2").start();
  }

  // 该线程不断地进行睡眠
  static class TimeWaiting implements Runnable {
    @Override
    public void run() {
      while (true) {
        SleepUtils.second(100);
      }
    }
  }

  // 该线程在Waiting.class实例上等待
  static class Waiting implements Runnable {
    @Override
    public void run() {
      while (true) {
        synchronized (Waiting.class) {
          try {
            Waiting.class.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }

  // 该线程在Blocked.class实例上加锁后,不会释放该锁
  static class Blocked implements Runnable {
    @Override
    public void run() {
      synchronized (Blocked.class) {
        while (true) {
          SleepUtils.second(100);
        }
      }
    }
  }
}

class SleepUtils {
  public static final void second(long seconds) {
    try {
      TimeUnit.SECONDS.sleep(seconds);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:48:23  更:2022-03-06 12:49:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:04:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码