首页 > 其他分享 >Thread Interrupt详解

Thread Interrupt详解

时间:2023-03-19 12:56:29浏览次数:50  
标签:Thread interrupted public interrupt 详解 线程 Interrupt isInterrupted

线程interrupt

interrupt

如下方法的调用会使得线程进入阻塞状态,而调用当前线程的interrupt方法,可以打断阻塞。

Object的wait,Thread的sleep,Thread的join,InterruptibleChannel的io操作 等等

若当前线程在阻塞的状态,另外一个线程调用被阻塞线程的interrupt方法,则会打断这种阻塞,因此这种方法有时候可被称为可中断方法。

一旦线程在阻塞的情况下被打断,都会抛出一个称为InterruptedException的异常,这个异常就像一个Signal(信号)通知当前线程被打断

public class ThreadInterrupt{
	public static void main(String[] args) throws InterruptedException{
    Thread thread = new Thread(()->{
      try{
        TimeUnit.MINUTES.sleep(1);
      } catch(InterruptedException e){
        sout("Oh i am be interrupted");
      }
    });
    thread .start();
    TimeUnit.MILLISECONDS.sleep(2);
    thread.interrupt();
  }
}

上面的代码创建了一个线程,并且企图休眠1分钟的时长,但大约两秒之后就会被主线程调用interrupt方法打断。输出”i am be interrupted"

为啥,因为在线程内部有一个Interrupted flag,如果一个线程被interrupt,那么它的flag将被设置,但是如果当前线程正在执行可中断方法被阻塞时,调用interrupt方法将其中断,反而会导致flag被清除,负负得正,如果线程已经死亡,尝试对其interrupt会被直接忽略。

isInterrupted

isInterrupted 是Thread的一个成员方法,它主要判断当前线程是否被中断,该方法仅仅是对interrupted标识的一个判断,并不会影响标识发生任何改变。

public class ThreadisInterrupted{
	public static void main(String[] args) throws InterruptedException
	{
	Thread thread = new Thread()
  {
    public void run()
    {
      while(true){
        // do nothing,just empty loop
      }
    }
  };
    thread.start();
    TimeUnit.MILLISECONDS.sleep(2);
    souf("Thread is interrupted ? %s\n",thread.isInterrupted());
    thread.interrupt();
    souf("Thread is interrupted ? %s\n",thread.isInterrupted());
	}
}

结果为

Thread is interrupted ? false;

Thread is interrupted ? true;

如果是可中断方法,会擦除Interrupted标识,为啥?因为不影响线程中其他方法的执行。

Interrupted

interrupted是一个静态方法,虽然其也用于判断当前线程是否可被中断,但是它和成员方法isInterrupted还是有很大区别的,调用该方法会直接擦除掉线程的interrupt标识,需要注意的是,如果当前线程被打断了,第一次掉用会返回true;第二次包括以后的调用永远都会返回false

interrupt注意事项

isInterrupted方法和interrupted方法都调用了同一个本地方法

private native boolean isInterrupted(boolean ClearInterrupted)

public boolean isInterrupted(){
return isInterrupted(false);
}
public static boolean interrupted(){
  return currentThread().isInterrupted(true);
}
 public static void main(String[] args) {
        System.out.println("Main thread is interrupted? " +Thread.interrupted());
        Thread.currentThread().interrupt();
        System.out.println("Main thread is interrupted? " +Thread.currentThread().isInterrupted());
        try{
            TimeUnit.MINUTES.sleep(1);
        }catch (InterruptedException e){
            System.out.println("i will be interrupted still.");
        }
    }

标签:Thread,interrupted,public,interrupt,详解,线程,Interrupt,isInterrupted
From: https://www.cnblogs.com/metatreasure/p/17232846.html

相关文章

  • Optional 详解
    1前言Optional是Java8的新特性,专治空指针异常(NullPointerException,简称NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于Conllection)。为方便用户通过Lambd......
  • 正则表达式(Regular Expression)详解
    1前言正则表达式主要用于复杂文本处理,如模式匹配、格式检验、文本替换等。常用的通配符有:^,$,*,.,,-,+,?,&,|,(),[],{}2String中的split()、matches()、r......
  • Java线程池详解
    1使用线程池的好处降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;提高线程的......
  • JVM详解
    1JVM运行机制概述JVM运行机制类加载机制:类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显式加载两种方式。隐式加载是指在使用new等方式创建对......
  • etcd详解
    etcd原理详解etcd概述etcd的特点etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能etcd具有以下特点:......
  • Android自动化测试框架uiautomator2详解
    1uiautomator2简介​uiautomator2是一种Android自动化测试框架,提供了点击、长按、输入文本、滑动、拖拽、截屏等方法,能够模拟用户的各种动作。用户可以通过控件......
  • tensorflow中交叉熵损失函数详解
    1前言tensorflow中定义了3个交叉熵损失函数:softmax_cross_entropy_with_logits(logits,labels)softmax_cross_entropy_with_logits_v2(logits,labels)sparse_softm......
  • java学习日记20230318-object类详解
    objectClass Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。equals==和equals的区别==比较运算符,既可以......
  • 关系范式详解
    1前言关系模式规范化过程函数依赖:若Y=f(X),则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字,将Y置为非主属性。2范式2.11NF1NF定义:关系的所......
  • Linux 远程数据同步工具详解(rsync)
    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文......