Java 详细讲解线程的状态及部分常用方法

可以通过 Thread.getState 方法获得线程的状态(线程一共有 6 种状态)

NEW(新建)new:尚未启动

RUNNABLE(可运行状态)runnable:正在 JVM 中运行;或者正在等待操作系统的其他资源(比如处理器)

//有些编程语言会把RUNNABLE分成2种情况
//1.running
//2.ready
//以上2种在Java中都属于RUNNABLE

BLOCKED(阻塞状态) blocked:正在等待监视器锁(内部锁)

WAITING(等待状态) waiting:在等待另一个线程

调用以下方法会处于等待状态

没有超时值的 Object.wait

没有超时值的 Thread.join

LockSupport.park

//后续会详细介绍

TIMED_WAITING(定时等待状态) timed_waiting

调用以下方法会处于定时等待状态

Thread.sleep

有超时值的 Object.wait

有超时值的 Thread.join

LockSupport.parkNanos

LockSupport.parkUnti

//后续会详细介绍

TERMINATED(终止状态):已经执行完毕

部分实例:

public class Main {
	public static void main(String[] a) {
		Thread dangqian = Thread.currentThread();//获取主线程
		System.out.println(dangqian.getState());//输出RUNNABLE
		//表示主线程正处于RUNNABLE状态

		Thread tj = new Thread();//新建1个线程
		System.out.println(tj.getState());//输出NEW

		Thread tj1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("ACM");
			}
		});
		tj1.start();
		//启动执行完run方法后线程终止 此时处于TERMINATED状态
	}
}
  • sleep   interrupt 介绍

可以通过 Thread.sleep 方法暂停当前线程,进入WAITING状态

在暂停期间,若调用线程对象的 interrupt 方法中断线程,会抛出 java.lang.InterruptedException 异常

实例(注释)介绍更为明了:

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		//因为是多线程,在执行tj线程时,主线程依然往下走
		try {
			Thread.sleep(1000);//让主线程睡1s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
		//由于tj线程睡得较久,所以先打印3,再打印2
		tj.interrupt();//中断此线程,但实际上只是给线程设置一个中断标志,线程仍会执行;在这里用于触发异常
	}
}

输出:

1
3
2

  • join  isAlive  介绍

A.join 方法:等线程 A 执行完毕后,当前线程再继续执行任务。可以传参指定最长等待时间

A.isAlive 方法:查看线程 A 是否还活着

实例:

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		System.out.println(tj.isAlive());//此时3s未过,tj线程仍在执行;所以输出true
		try {
			tj.join();//等tj线程执行完毕再往下执行
			//tj.join(1000); 等待tj线程1s再往下执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
	    System.out.println(tj.getState());
	    System.out.println(tj.isAlive());//tj线程已执行完毕;所以输出false
	}
}

输出:

true
1
2
3
TERMINATED
false

到此这篇关于Java 详细讲解线程的状态及部分常用方法的文章就介绍到这了,更多相关Java 线程的状态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java并发编程之线程状态介绍

    目录 线程状态概述 睡眠sleep方法 等待和唤醒 等待唤醒的一个小例子 线程状态概述 线程由生到死的完整过程: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State这个枚举中给出了六种线程状态: 线程状态 导致状态发生条件 NEW(新建) 线程刚被创建,但是并未启动.还没调用start方法.MyThread t = new MyThread只有线程对象,没有线程特征. Runna

  • Java多线程之线程状态详解

    目录 线程状态 停止线程 线程休眠 模拟网络延迟(放大问题的发生性) 模拟计时 线程礼让 插队(线程强制执行) 线程状态观测 线程优先级 守护线程 总结 线程状态 五个状态:新生.就绪.运行.死亡.阻塞 停止线程 不推荐使用JDK提供的stop().destroy()方法[已弃用] 推荐线程自己停止 建议用一个标志位进行终止变量,到flag=false,则终止线程运行 public class StopDemo implements Runnable { // 设置一个标志位 boolean f

  • Java 解析线程的几种状态详解

    目录 1.线程的5种状态 2.Java线程的6种状态 3.Java线程状态的转换 总结 1. 线程的5种状态 从操作系统层面上,任何线程一般都具有五种状态,即创建.就绪.运行.阻塞.终止. (1) 新建状态(NEW) 在程序中用构造方法创建一个新线程时,如new Thread(),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行. (2) 就绪状态(READ) 新建线程对象后,调用该线程的start()方法就可以启动线程.当线程启动时,线程就进入就绪状态(runna

  • 解答为什么 Java 线程没有Running状态

    目录 一.什么是 RUNNABLE? 二.与传统的ready状态的区别 三.与传统的running状态的区别 四.当I/O阻塞时 五.如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 一.什么是 RUNNABLE? 直接看它的 Javadoc 中的说明: 一个在 JVM 中执行 的线程处于这一状态中.(A thread

  • 教你如何监控 Java 线程池运行状态的操作(必看)

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. 如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数.正在排队中的线程数.已经执行完成的线程数.总线程数等. 总线程数 = 排队线程数 +

  • 浅谈JAVA 线程状态中可能存在的一些误区

    BLOCKED 和 WAITING 的区别 BLOCKED 和 WAITING 两种状态从结果上来看,都是线程暂停,不会占用 CPU 资源,不过还是有一些区别的 BLOCKED 等待 Monitor 锁的阻塞线程的线程状态,处于阻塞状态的线程正在等待 Monitor 锁进入 synchronized   Block 或者 Method ,或者在调用 Object.wait 后重新进入同步块/方法.简单的说,就是线程等待 synchronized 形式的锁时的状态 下面这段代码中, t1 在等待

  • Java 详细讲解线程的状态及部分常用方法

    可以通过 Thread.getState 方法获得线程的状态(线程一共有 6 种状态) NEW(新建)new:尚未启动 RUNNABLE(可运行状态)runnable:正在 JVM 中运行:或者正在等待操作系统的其他资源(比如处理器) //有些编程语言会把RUNNABLE分成2种情况//1.running//2.ready//以上2种在Java中都属于RUNNABLE BLOCKED(阻塞状态) blocked:正在等待监视器锁(内部锁) WAITING(等待状态) waiting:在等待另一个

  • Java 详细讲解线程的状态及部分常用方法

    可以通过 Thread.getState 方法获得线程的状态(线程一共有 6 种状态) NEW(新建)new:尚未启动 RUNNABLE(可运行状态)runnable:正在 JVM 中运行:或者正在等待操作系统的其他资源(比如处理器) //有些编程语言会把RUNNABLE分成2种情况//1.running//2.ready//以上2种在Java中都属于RUNNABLE BLOCKED(阻塞状态) blocked:正在等待监视器锁(内部锁) WAITING(等待状态) waiting:在等待另一个

  • Java 详细讲解线程安全与同步附实例与注释

    目录 线程安全问题 实例: 存钱取钱问题 买票问题 线程安全问题 分析问题 解决方案 线程同步 同步语句 synchronize(obj)的原理 同步方法 同步方法的本质 线程安全问题 多个线程可能会共享(访问)同一个资源 比如访问同一个对象,同一个变量,同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题,称为线程安全问题 什么情况下会出现线程安全问题 多个线程共享同一个资源 且至少有一个线程正在执行写的操作 实例: 存钱取钱问题 分别有存钱和取钱2个线程 存钱      

  • Java 详细讲解分治算法如何实现归并排序

    目录 1.什么是分治算法 分治法 基本思想 2.分治算法的体现--归并排序 归并排序 基本思想 3.代码实现 1.什么是分治算法 分治法 分治法,字面意思是"分而治之",就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等. 基本思想 分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小

  • Java详细讲解不同版本的接口语法和抽象类与接口的区别

    目录 什么是接口? 接口的语法: (JDK7.0) 接口的语法: (JDK8.0) 接口的语法: (JDK9.0)—(私有方法) 接口的分类 常量接口: 空接口: 函数式接口: 什么是接口? 说到接口,USB大家肯定不陌生~接口是一种标准.规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准. 接口的语法: (JDK7.0) (1) 关键字:interface (2) 语法:  interface 接口名{} (3) 接口编译之后会生成对应的 .class文件 (4) 接口不能创建对象,但

  • Java 详细讲解用堆解决Top-k问题

    目录 1.什么是堆? 堆结构 大根堆 VS 小根堆 大根堆(最大堆) 小根堆(最小堆) 优先级队列(PriorityQueue) 2.top-k问题解决思路 要解决 top-k 问题,我们应该先熟悉一种数据结构 - 堆(优先级队列),已经了解的朋友可以跳过哦. 1.什么是堆? 堆结构 堆其实就是一种二叉树,但是普通的二叉树是以链式结构进行储存数据的,而堆是以数组进行顺序存储数据的.那么什么样的二叉树才适合用顺序存储的方式呢? 我们假设一颗普通的二叉树可以用数组存储,那么就可以得到如下结构: 我们

  • Java详细讲解分析双指针法的使用

    目录 前言 1.判断链表是否有环 2.查找链表中间的元素 3.奇偶排序前奇后偶 4.删除排序链表的重复元素 5.三数之和 6.分割链表 7.合并两个有序的数组 8.两数之和—输入有序数组 9.长度最小的子数组 10.排序链表 前言 通常用在线性的数据结构中,比如链表和数组. 指针其实就是数据的索引或者链表的结点.两个指针朝着左右两个方向移动,直到满足搜索条件. 双指针可分为同向双指针.异向双指针.快慢指针.滑动窗口.根据需求选择双指针的模型,比如 删除数组或链表中重复的元素,同向双指针(线性表前

  • Java详细讲解堆排序与时间复杂度的概念

    目录 一.堆排序 1.什么是堆排序 2.堆排序思想 3.代码实现 二.时间复杂度分析 1.初始化建堆 2.排序重建堆 3.总结 一.堆排序 1.什么是堆排序 (1)堆排序:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. (2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

  • Java详细讲解文件的读写操作方法

    目录 java的IO 字节流 InputStream的常用方法 OutputStream的常用方法 字节流读写文件 如何将数据写入到文件中 java的IO Java程序允许通过流的方式与输入输出设备进行数据传输.Java中的流都在java.io包中,称为IO(输入输出)流.IO流按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同,又可以分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据,在IO包中,字节流的输入输出分别用java.InputStream和java.io

  • Java详细讲解包的作用以及修饰符的介绍

    目录 1.包 1.包的三大作用 2.包的基本语法 3.包的本质 4.包的命名规则 5.包的命名规范 6.常用的包 7.注意事项和使用细节 2.访问修饰符 1.4种访问修饰符的访问范围 2.使用注意事项 3.具体实例说明 1. 同类 2. 同包 3. 不同包子类 4. 不同包 1.包 1.包的三大作用 区分相同名字的类 当类很多时,可方便管理 控制访问范围 2.包的基本语法 package abc.www; 3.包的本质 实际上就是创建不同的文件夹/目录保存类文件 4.包的命名规则 只能包含数字,

随机推荐