首页 > 编程语言 >操作系统线程和Java线程的状态

操作系统线程和Java线程的状态

时间:2024-05-10 10:46:36浏览次数:24  
标签:状态 调用 Java 操作系统 线程 等待 CPU

操作系统线程和Java线程的状态

   一、操作系统线程的状态

   操作系统的线程主要有以下三个状态

   1.  就绪状态(ready):线程正在等待使用 CPU,经调度程序调用之后进入 running 状态。

   2. 执行状态(running):线程正在使用 CPU。

   3. 等待状态(waiting): 线程经过等待事件的调用或者正在等待其他资源(如 I/O)。

   二、Java中线程的状态

   Java中线程的状态分为6种。

1 // Thread.State 源码
2 public enum State {
3     NEW,
4     RUNNABLE,
5     BLOCKED,
6     WAITING,
7     TIMED_WAITING,
8     TERMINATED;
9 }

   1.  初始状态(New)

   当线程对象被创建但尚未启动时,处于新建状态

   示例代码如下:

1 private void testStateNew() {
2     Thread thread = new Thread(() -> {});
3     System.out.println(thread.getState()); // 输出 NEW
4 }

   2. 可运行状态 (RUNNABLE)

   表示当前线程正在运行中。处于 RUNNABLE 状态的线程在 Java 虚拟机中运行,也有可能在等待 CPU 分配资源。

   说明:

   1)Java 线程的RUNNABLE状态其实包括了操作系统线程的就绪(ready)和运行中(running)两个状态

   2)线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

   3.  阻塞状态(BLOCKED)

   阻塞状态。处于 BLOCKED 状态的线程正等待锁的释放以进入同步区。

   说明:一个线程获取一个内部的对象锁的时候这个锁对象被其他线程占用了,那么这个线程就会被阻塞。是一种锁阻塞。

   4. 等待(WAITING)

   进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

   调用下面这 3 个方法会使线程进入等待状态:

   1)Object.wait():使当前线程处于等待状态直到另一个线程唤醒它

   2)Thread.join():等待线程执行完毕,底层调用的是 Object 的 wait 方法

   3)LockSupport.park():除非获得调用许可,否则禁用当前线程进行线程调度

   5.  超时等待(TIMED_WAITING)

   超时等待状态。线程等待一个具体的时间,时间到后会被自动唤醒。

   调用如下方法会使线程进入超时等待状态:

   1)Thread.sleep(long millis):使当前线程睡眠指定时间

   2)Object.wait(long timeout):线程休眠指定时间,等待期间可以通过notify()/notifyAll()唤醒

   3)Thread.join(long millis):等待当前线程最多执行 millis 毫秒,如果 millis 为 0,则会一直执行

   4)LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间

   5)LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间

   说明:处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由操作系统自动唤醒。

   6.  终止状态(TERMINATED)

   线程执行完毕或者因为异常退出而终止时处于该状态。

   说明:

   1)终止状态为了两种情况,一种就是我们调用run方法,正常执行完毕,线程自然终止。

   2)因为一个没有捕获的异常终止了run方法,使线程意外终止。

 

标签:状态,调用,Java,操作系统,线程,等待,CPU
From: https://www.cnblogs.com/hld123/p/18183786

相关文章

  • 【java】ArrayList和LinkedList的区别
    一、ArrayList和LinkedList的相同点ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用,他们都可以对元素的增删改查进行操作。ArrayList、LinkedList、Vector和Stack是List的四个实现类,List是一个接口,它继承与Collection接口,代表有序的队列。其中Vector......
  • Java学设计模式之享元模式
    一、享元模式概念1.1什么是享元模式享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。在享元模式中,对象被设计成可共享的,以便在需要时能够被多个不同的上下文使用。结构享元模式通常包含以下几个要素:Flyweight(享元):定义了共享对象的接口......
  • JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)
    一、简介Map就是用来存储“键(key)-值(value)”对的.通过键寻找value,所以键不能重复.数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便.实际开发中较为常用.二、Map的常用方法实例(1......
  • JAVA_WEB复习之请求响应
    简单参数请求:原始的方法,我们需要通过servlet中提供的api,HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数:当tomcat接收到请求时,它会把请求的信息封装httpservletrequest到对象中。而在Springboot的环境,原始的API进行了封装,接收参数的形式更加简单。如果是简单......
  • Springboot项目的jar包的运行方式以及使用yum安装java后忘记了位置
    SpringBoot项目打包后的jar的部署方式这里我写了五种部署方式1.直接启动java-jarxxx.jar这种方式就只适合自己在测试时用一下,关闭会话就能停止运行属实是方便。2.后台启动java-jarxxx.jar&在后台静默启动,同样关闭会话也会停止,优点是和上面一样,日志是打印在窗口的3......
  • java9
    小练习:publicclasstest1{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入当前机票的原价");intticket=sc.nextInt();System.out.println("请输入月份");int......
  • Java根据数学公式计算出结果
    importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.script.ScriptException;publicclassTest{publicstaticvoidmain(String[]args){//年均充放电量=(E2*H4*G4*0.95*0.86)*0.871/10000Stringexpressi......
  • 【java】Java之关于基本数据类型和引用数据类型的存放位置
    1、基本数据类型存放在哪?基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了。关键是上下文。比如:123voidmethod(){    inta=3;}这自然是存在栈里的。局部方法嘛。而:123classTest{    inta=3;}......
  • Java学设计模式之桥接模式
    一、桥接模式概念1.1什么是桥接模式桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象部分和实现部分分离来解决多维度变化的问题,从而提高了系统的灵活性和可扩展性。结构桥接模式通常由以下几个部分组成:Abstraction(抽象类......
  • 如果想得到线程中的反悔呢
    importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.*;publicclassMain{publicstaticvoidmain(String[]args){intcorePoolSize=5;//核心线程数intmaxPoolSize=10;//最大线程数longkeepAlive......