interrupt(),interrupted() 和 isInterrupted() 的区别
1. 结论先行
interrupt():将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。
interrupted():获取当前线程的中断状态,并且会清除线程的状态标记。是一个是静态方法。
isInterrupted():获取调用该方法的对象所表示的线程,不会清除线程的状态标记。是一个实例方法。
现在对各方法逐一进行具体介绍:
2. interrupt()
首先我们来使用一下 interrupt() 方法,观察效果,代码如下:
public class MainTest {
   @Test
   public void test() {
       try {
           MyThread01 myThread = new MyThread01();
           myThread.start();
           myThread.sleep(2000);
           myThread.interrupt();
       } catch (Exception e) {
           System.out.println("main catch");
           e.printStackTrace();
       }
   }
}
public class MyThread01 extends Thread {
   @Override
   public void run() {
       super.run();
       for (int i = 0; i < 500; i++) {
           System.out.println("i= " + i);
       }
   }
}
输出结果:
可以看出,子线程已经执行完成了。说明 interrupt() 方法是不能让线程停止,和我们一开始所说的那样,它仅仅是在当前线程记下一个停止标记而已。
那么这个停止标记我们又怎么知道呢?——此时就要介绍下面的 interrupted() 和 isInterrupted() 方法了。
3. interrupted() 和 isInterrupted()
- interrupted() 方法的声明为 - public static boolean interrupted()
- isInterrupted() 方法的声明为 - public boolean isInterrupted()
这两个方法很相似,下面我们用程序来看下使用效果上的区别吧
先来看下使用 interrupted() 的程序。
@Test
public void test() {
      try {
          MyThread01 myThread = new MyThread01();
          myThread.start();
          myThread.sleep(1000);
//     7行: Thread.currentThread().interrupt(); // Thread.currentThread() 这里表示 main 线程
          myThread.interrupt();
          // myThread.interrupted() 底层调用了 currentThread().isInterrupted(true); 作用是判断当前线程是否为停止状态
          System.out.println("是否中断1 " + myThread.interrupted());
          System.out.println("是否中断2 " + myThread.interrupted());
      } catch (InterruptedException e) {
          System.out.println("main catch");
      }
  System.out.println("main end");
}
输出结果:
由此可以看出,线程并未停止,同时也证明了 interrupted() 方法的解释:测试当前线程是否已经中断,这个当前线程就是 main 线程,它从未中断过,所以打印结果都是 false。
那么如何使 main 线程产生中断效果呢?将上面第 8 行代码注释掉,并将第 7 行代码的注释去掉再运行,我们就可以得到以下输出结果:
从结果上看,方法 interrupted() 的确判断出了当前线程(此例为 main 线程)是否是停止状态了,但为什么第二个布尔值为 false 呢?我们在最开始的时候有说过——interrupted() 测试当前线程是否已经是中断状态,执行后会将状态标志清除。
因为执行 interrupted() 后它会将状态标志清除,底层调用了 isInterrupted(true),此处参数为 true 。所以 interrupted() 具有清除状态标记功能。
在第一次调用时,由于此前执行了 Thread.currentThread().interrupt();,导致当前线程被标记了一个中断标记,因此第一次调用 interrupted() 时返回 true。因为 interrupted() 具有清除状态标记功能,所以在第二次调用 interrupted() 方法时会返回 false。
以上就是 interrupted() 的介绍内容,最后我们再来看下 isInterrupted() 方法吧。
isInterrupted() 和 interrupted() 有两点不同:一是不具有清除状态标记功能,因为底层传入 isInterrupted() 方法的参数为 false。二是它判断的线程调用该方法的对象所表示的线程,本例为 MyThread01 对象。
我们修改一下上面的代码,看下运行效果:
@Test
public void test() {
   try {
       MyThread01 myThread = new MyThread01();
       myThread.start();
       myThread.sleep(1000);
       myThread.interrupt();
       // 修改了下面这两行。
       // 上面的代码是 myThread.interrupted();
       System.out.println("是否中断1 " + myThread.isInterrupted());
       System.out.println("是否中断2 " + myThread.isInterrupted());
   } catch (InterruptedException e) {
       System.out.println("main catch");
       e.printStackTrace();
   }
   System.out.println("main end");
}
输出结果:
结果很明显,因为 isInterrupted() 不具有清除状态标记功能,所以两次都输出 true。
参考文章:http://www.cnblogs.com/hapjin/p/5450121.html
interrupt(),interrupted() 和 isInterrupted() 的区别的更多相关文章
- java中interrupt,interrupted和isInterrupted的区别
		文章目录 isInterrupted interrupted interrupt java中interrupt,interrupted和isInterrupted的区别 前面的文章我们讲到了调用int ... 
- interrupt ,interrupted 和 isInterrupted
		1.interrupt interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 ... 
- java---interrupt、interrupted和isInterrupted的区别
		1.interrupt() interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己 ... 
- 【JAVA多线程】interrupted() 和 isInterrupted() 的区别
		Thread 类中提供了两种方法用来判断线程的状态是不是停止的.就是我们今天的两位主人公 interrupted() 和 isInterrupted() . interrupted() 官方解释:测试 ... 
- interrupt和interrupted和isInterrupted的区别
		原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11413917.html interrupt Code Demo package org.fool.th ... 
- interrupt interrupted isInterrupted 方法对比、区别与联系 多线程中篇(八)
		interrupt interrupted isInterrupted 是三个“长相”非常类似的方法. 本文将对这三个方法简单的对比下,首先了解下线程停止的方式 线程停止方式 在Java中如果想停止一 ... 
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
		一,介绍 本文记录JAVA多线程中的中断机制的一些知识点.主要是stop方法.interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析. JAVA中有3种方 ... 
- interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程
		interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ... 
- java线程interrupt、interrupted 、isInterrupted区别
		前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ... 
随机推荐
- WEB前端开发--1(Web前端开发综述)
			Web前端开发 Web--Web系统 前端--网页上为用户呈现的部分 开发--编写代码 1. 前端与后端 前端:网页上为用户呈现的部分 后端:与数据库进行交互,完成数据存取 2. 网站与 ... 
- LeetCode随缘刷题之最长回文子串
			这一题我用的相对比较笨的方法. 相对于大佬们用的动态规划法,比较复杂.但却更容易理解,我主要是通过记录下标来确定最长回文串的. package leetcode.day_12_06; /** * 给你 ... 
- PHP面试常考之会话控制
			你好,是我琉忆,欢迎您来到PHP面试专栏.本周(2019.2-25至3-1)的一三五更新的文章如下: 周一:PHP面试常考之会话控制周三:PHP面试常考之网络协议周五:PHP面试常考题之会话控制和网络 ... 
- opencv笔记--meanshift&camshift
			meanshift 被应用于 object track 中,其主要思想如下: 如下图所示,对该点集应用 meanshift 算法可以定位到点集最稠密位置,而点集最稠密位置即为我们需要跟踪的物体位置. ... 
- Spring扩展之五:Aware接口等
			ApplicationContextAwareProcessor 1.介绍 ApplicationContextAwareProcessor是一个Spring内部工具,它实现了接口BeanPostPr ... 
- 扫盲贴:2021 CSS 最冷门特性都是些啥?
			最近几年 CSS 界的大事之一是每年年底的 <State Of CSS>,也就是 CSS 现状调查,去年年底发布了<State Of CSS 2021>.其中关于特性这一章,会 ... 
- docker下安装nginx,启动ngixn,修改nginx配置等--超详细
			1.获取nginx版本 docker中nginx版本信息:https://hub.docker.com/_/nginx?tab=tags&page=1&ordering=last_up ... 
- prometheus k8s服务发现
			Prometheus的服务发现在解决什么问题? 被监控的目标(target)是整个监控体系中重要组成部分,传统监控系统zabbix通过 网络发现的机制自动创建主机到zabbix-server,进而快速 ... 
- 如何在win10系统上安装linux子系统
			对于软件开发人员来说,linux基本上是一个绕不过去的槛. 因为工作经常要用到linux,电脑用纯linux还是windows + 虚拟机装linux,我一直纠结. 如果装个纯linux,则一些win ... 
- 在 Linux 下确认 NTP 是否同步的方法
			NTP 意即网络时间协议Network Time Protocol,它通过网络同步计算机系统之间的时钟.NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业.NTP 客户端会将 ... 
