Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

作者头像
向着百万年薪努力的小赵
发布于 2022-12-02 02:36:03
发布于 2022-12-02 02:36:03
36200
代码可运行
举报
文章被收录于专栏:小赵的Java学习小赵的Java学习
运行总次数:0
代码可运行

怎么查看线程状态

  1. jps指令查看我当前的进程ID
  2. jstack 线程ID

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StatusDemo {
	public static void main(String[] args) {
		new Thread(()->{
			while(true) {
				LockSupport.park();
			}
		},"huihui_waiting").start(); //阻塞状态
		new Thread(()->{
			try {
				Thread.sleep(100000);
			} catch (InterruptedException e){
				e.printStackTrace();
			}
		},"huihui_time_waiting").start(); //阻塞状态
	new Thread(new BlockClass(),"huihui_thread").start();
	new Thread(new BlockClass(),"huihui_block").start();
	}
	static class BlockClass extends Thread{
		public void run(){
			synchronized(BlockClass.class){
				try{
					Thread.sleep(1000000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
			}
		}
	}
}

查看状态:

  1. jps指令得到我程序的进程信息

得到我当前的进程为20376

  1. 通过jstack 20376得到线程的状态信息

线程终止

刚才我们讲过,一个线程里面任务正常执行完毕,状态就是TERMINATED,就是终止状态。 但是,如果我线程里面的任务一直没有执行完成,我想去终止这个线程,或者我给点信息给到线程里,告诉线程我想终止结束呢! 所以我可以强制去关闭线程:线程提供一个stop方法,该方法不建议使用,已经过时了!!

因为stop是强行关闭线程,线程里面的任务都不在执行,不管线程的任务是否执行成功与否,就算执行到一半也会强制关闭!导致很多不可控制的 结果,比如支付付一半等等!!

所以我们要需要去优雅的关闭。什么叫做优雅关闭,就是我告诉你,我需要关闭了,但是我不强制关闭

线程里面提供了interrupt来优雅关闭,示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package thread.demo.interrupt;
public class InterruptTest implements Runnable{
	@Override
	public void run() {
		while (!Thread.currentThread().isInterrupted()) {
		//false
			try {
				Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
					System.out.println("异常里的isInterrupted:"+Thread.currentThread().isInterrupted());
					Thread.currentThread().interrupt(); //再次中断
					System.out.println("再次中断:"+Thread.currentThread().isInterrupted());
				}
			}
		System.out.println("线程结束");
	}
	public static void main(String[] args) throws InterruptedException {
		Thread t1=new Thread(new InterruptTest());
		t1.start();
		Thread.sleep(1000);
		//不中断,线程不进异常不中断,中断,线程会进入异常并且复位
		t1.interrupt();
	}
}

其思想:有个共享变量 类型boolean的isInterrupted,默认是false,然后外面可以改成true,线程里面可以获取到状态,如果是true,那么就说明外面有人想要我中断,那么如果我当前是waiting或者timewaiting状态,就会唤醒我的线程进入InterruptedException异常!!

interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

  • interrupt() 优雅的通知线程需要结束,如果线程在waiting 会抛出InterruptedException,线程自己决定要不要结束,异常会触发复位
  • isInterrupted()获取线程的中断标记,但是不会进行复位操作
  • interrupted()获取线程的中断标记,并且主动执行复位操作

interrupted()示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws InterruptedException {
	Thread.currentThread().interrupt();
	System.out.println(Thread.interrupted()); //返回true,当前线程被interrupt
	System.out.println(Thread.currentThread().isInterrupted()); //获取线程的interrupt状态,本来应该是true,但是interrupted触发了复位,为false
}

线程状态的定义

其实Thread类下有JAVA层面对Thread状态的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum State {
	/**
	* Thread state for a thread which has not yet started.
	*/
	NEW,
	/**
	* Thread state for a runnable thread. A thread in the runnable
	* state is executing in the Java virtual machine but it may
	* be waiting for other resources from the operating system
	* such as processor.
	*/
	RUNNABLE,
	/**

	* Thread state for a thread blocked waiting for a monitor lock.
	* A thread in the blocked state is waiting for a monitor lock
	* to enter a synchronized block/method or
	* reenter a synchronized block/method after calling
	*{@link Object#wait() Object.wait}.
	*/
	BLOCKED,
	/**
	* Thread state for a waiting thread.
	* A thread is in the waiting state due to calling one of the
	* following methods:
	* <ul>
	* <li>{@link Object#wait() Object.wait} with no timeout</li>
	* <li>{@link #join() Thread.join} with no timeout</li>
	*<li>{@link LockSupport#park() LockSupport.park}</li>
	* </ul>
	*
	* <p>A thread in the waiting state is waiting for another thread to
	* perform a particular action.
	*
	* For example, a thread that has called <tt>Object.wait()</tt>
	* on an object is waiting for another thread to call
	* <tt>Object.notify()</tt> or <tt>Object.notifyAll() </tt> on
	* that object. A thread that has called <tt>Thread.join()</tt>
	* is waiting for a specified thread to terminate.
	*/
	WAITING,
	/**
	* Thread state for a waiting thread with a specified
	waiting time.
	* A thread is in the timed waiting state due to
	calling one of
	* the following methods with a specified positive
	waiting time:
	* <ul>
	* <li>{@link #sleep Thread.sleep}</li>
	* <li>{@link Object#wait(long) Object.wait} with timeout</li>
	*<li>{@link #join(long) Thread.join} with timeout</li>
	*<li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
	*<li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
	*
	</ul>
	*/
	TIMED_WAITING,
	/**
	* Thread state for a terminated thread.
	* The thread has completed execution.
	*/
	TERMINATED;
}

其实我们想一下,任何东西的生命周期都是开始与死亡!! 所以线程肯定有2种状态 初始(NEW) 新创建了一个线程对象,但是没有调用start()方法 终止(TERMINATED) 这个线程执行完毕 除了这2种状态外,线程还有以下几种状态 运行(RUNNABLE) 我们线程开启是需要start 的,所以初始化后,有个运行状态 等待(WAITING) 进入该状态的线程需要等待其他线程做出一些特定动作,线程进入了这个状态一般调用了

  • Object.wait() 需要等待另一个线程执行Object.notify()或者Object.notifyAll()
  • Thread.join() 需要等待线程执行完成
  • jpsLockSupport.park() 等待执行LockSupport.unpark(thread)

超时等待(TIMED_WAITING) 指定了时间后自行返回,等待一段时间后,会唤醒线程,而不是永久等待,一般执行过

  • Thread.sleep(long)
  • Object.wait(long)
  • Thread.join(long)
  • LockSupport.parkNanos()
  • LockSupport.parkUntil()

阻塞(BLOCKED) 线程阻塞于锁,比如synchronized

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Thread中interrupt()interrupted()和isInterrupted()的区别
RUNNABLE:start方法已运行,所有条件都就绪。只等该线程获得CPU运行时间。
zhangheng
2020/04/28
5240
java中线程的生命周期
线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发。
FunTester
2020/07/06
3580
java中线程的生命周期
基于多线程的方式优化 FLink 程序
线程算是相对较高级的内容,主要的原因不是说他难,而是它不可见。最近基于多线程的方式优化了一些 FLink 程序,所以这一系列,我们聊聊多线程
每周聚焦
2024/06/05
1600
Java线程状态(生命周期)以及线程状态转换详解
线程状态转换进入等待/超时等待进入等待状态进入超时等待LockSupport类简介过期的suspend和resume方法
用户7886150
2021/04/20
7140
线程状态切换代码小记
《java并发编程》那本书其实反复的看过很多遍了,也扒了很多多线程相关文章,但是不用的话很快就又忘记了 ,想到一个概念于是动手操作了一遍,以便加深认知。
小小明童鞋
2020/05/11
8080
Java 多线程系列(1) —— 线程入门
Java 中线程的优先级范围为 1~10,是一个 int 类型的值 其中最小的优先级 (MIN_PRIORITY) 为 1 正常优先级 (NORM_PRIORITY) 为 5 最高优先级 (MAX_PRIORITY) 为 10 【源码中定义的线程优先级】
求和小熊猫
2020/11/25
3630
Java 多线程系列(1) —— 线程入门
Java线程的那些状态
Java线程(或者说计算机线程),是有一些状态来表示当前线程运行信息的,可以通过jsatck命令来查看Java进程中线程函数栈信息,其中就包括了Java线程状态。
luoxn28
2021/04/08
3760
Java线程状态详解
最近在深入研究Java并发编程,看到网上有很多关于线程状态的总结,有的不全面,有的根本就是错的。因此,在这里我结合最权威的Java源代码,尝试对Java线程状态进行一个详细的解读。
张申傲
2020/09/03
9320
Java线程状态详解
面试题92:Java线程有几种状态?
Java线程一共分为6种状态,分别为: 新建状态(NEW) 就绪状态(RUNNABLE) 阻塞状态(BLOCKED) 等待状态(WAITING) 限时等待状态(TIMED_WAITING) 结束状态(TERMINATED) 我们也可以通过Tread中的State枚举查看这六种状态的定义: public enum State { /** * Thread state for a thread which has not yet started. */
爪哇缪斯
2023/05/10
2510
面试题92:Java线程有几种状态?
Java学习笔记——多线程
总结:Thread既实现了Runnable成员,又有一个Runnable成员。继承Thread实际上就是重写了run的方法,直接丢弃Runnable成员;第二种实现Runnable则是给成员Runnable赋值。
梦飞
2022/06/23
1730
JUC是什么?
在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC 就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包,JDK 1.5 开始出现的。
一个风轻云淡
2023/10/15
5250
JUC是什么?
Java线程生命周期与状态切换
最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
Throwable
2020/06/23
8790
Java线程的状态分析
本文将从源码角度分析Java线程的各种状态以及进入该状态所对应的操作。OpenJDK版本
KINGYT
2023/03/15
6350
Java线程的状态分析
多线程基础(二): Thread源码分析
前面已经对java中Thread的生命周期进行了分析,现在看看Thread的源码。
冬天里的懒猫
2020/09/08
5700
Java线程的几种状态
java.lang.Thread.State中定义的集中Java线程的状态: 1 /** 2 * A thread state. A thread can be in one of the following states: 3 * <ul> 4 * <li>{@link #NEW}<br> 5 * A thread that has not yet started is in this state. 6 * </li> 7 * <li>{@link
欠扁的小篮子
2018/04/10
1.4K0
Java线程的几种状态
关于interrupt(),interrupted(),isInterrupted()用法分析
interrupt()是用于中断线程的,调用该方法的线程的状态将被置为"中断"状态。注意:线程中断仅仅是设置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。这里可以看到中断后该线程还在继续往下执行,并没有强制终止线程。
砖业洋__
2023/05/06
3490
关于interrupt(),interrupted(),isInterrupted()用法分析
深入理解Java线程状态
实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态
JavaEdge
2019/09/16
5690
并发多线程学习(五)Java线程的状态及主要转化方法
处于NEW状态的线程此时尚未启动。这里的尚未启动指的是还没调用Thread实例的start()方法。
用户10168815
2023/02/28
3020
并发多线程学习(五)Java线程的状态及主要转化方法
并发编程1:全面认识 Thread
本文介绍了Java编程中线程的创建方式、启动方式、线程池的创建和线程池的使用,以及线程池的拒绝策略。同时,本文还介绍了线程的 run() 和 start() 方法的区别以及线程的中断和终止等知识点。
张拭心 shixinzhang
2018/01/05
7860
并发编程1:全面认识 Thread
Java多线程-线程状态
线程状态 6个状态定义:java.lang.Thread.State New: 尚未启动的线程的线程状态。 Runnable: 可运行线程的线程状态,等待CPU调度。 Blocked: 线程阻塞等待监视器锁定的线程状态。处于synchronized同步代码块或方法中被阻塞。 Waiting: 等待线程的线程状态。下列不带超时的方式:Object.wait、Thread.join、LockSupport.park Timed Waiting: 具有指定等待时间的等待线程的线程状态。下列超时的方式:Thread
小码农薛尧
2019/08/27
9870
Java多线程-线程状态
相关推荐
Thread中interrupt()interrupted()和isInterrupted()的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验