官网解释

If this thread is blocked in an invocation of the wait()wait(long), or wait(long, int) methods of the Object class, or of the join()join(long)join(long, int)sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.

意思是当线程被blocked的时候可以被打断,wait()、sleep()、join()时被打断会抛出InterruptedException异常。

演示sleep()被打断

        Thread t1 = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("running...");
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}; t1.start();
Thread.sleep(100L);
System.out.println(t1.isInterrupted());
t1.interrupt();
System.out.println(t1.isInterrupted());

在sleep()被打断在异常中要执行break;打断循环,否则该循环一直在执行

演示wait()被打断

package com.dwz.concurrency.chapter6;

public class ThreadInterrupt {
private static final Object MONITOR = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t2 = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("running...");
synchronized (MONITOR) {
try {
MONITOR.wait(100L);
} catch (InterruptedException e) {
System.out.println("收到打断信号。。。");
e.printStackTrace();
break;
}
}
}
}
}; t2.start();
Thread.sleep(100L);
System.out.println(t2.isInterrupted());
t2.interrupt();
System.out.println(t2.isInterrupted());
}
}

1.跟sleep()一样,wait()被打断时在异常中要执行break;打断循环,否则该循环一直在执行

2.wait()的调用者一定是一个对象

演示join()被打断

package com.dwz.concurrency.chapter6;

public class ThreadInterrupt3 {
public static void main(String[] args) throws InterruptedException {
Thread main = Thread.currentThread();
Thread t1 = new Thread() {
@Override
public void run() {
while (true) {

             System.out.println(Thread.currentThread().getName());
             System.err.println(Thread.currentThread().isInterrupted());

                }
}
}; t1.start(); System.out.println("main: " + main.getName());
Thread t2 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2: " + Thread.currentThread().getName());
main.interrupt();
System.out.println("interrupt...");
}
};
t2.start(); try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

1.我们要清楚,join的对象是main线程,要想打断 t1.join(), 要在另一个线程中执行 main.interrupt()

2.isInterrupted()表示线程是否被打断,如果只执行 main.interrupt() 方法,意味着 t1.join()被打断

3. t1.join() 一定要在 t1.start() 和  t2.start() 之后被执行。

线程的interrupt()的更多相关文章

  1. Java 并发:线程中断-interrupt

    一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...

  2. java线程的interrupt方法

    java现成的interrupt方法比较容易误导新手,它其实是不会中断(停止)当前的线程,只是标志一下当前线程的某个状态值(中断标志位),并且这个状态为只对阻塞方法(比如说:             ...

  3. 线程的Interrupt方法与InterruptedException解析

    线程阻塞状态与等待状态(当一个线程处于被阻塞或等待状态时,它暂时不活动,不允许任何代码且消耗最少的资源) 当一个线程试图获得一个内部的对象锁(而不是java.util.concurrent库中的锁), ...

  4. 线程中断 interrupt 和 LockSupport

    本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题: 线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗? 判断线程是否中断的方法有几个,它们之 ...

  5. 日积月累--线程中断interrupt()方法

    线程中断方法interrupt()方法的理解: interrupt()方法的源码: interrupted()方法的源码及注解: isInterrupted()方法源码及注解: 在了解这个方法之前我们 ...

  6. 【杂谈】线程中断——Interrupt

    前言 以前有一个错误的认识,以为中断操作都会抛出异常,后来才发现并不是这样,所以今天就来做一个关于中断的总结. 如何关闭线程 已被弃用的Stop方法 早期,Thread类中有一个stop方法,用于强行 ...

  7. Java线程停止interrupt()方法

    程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 中 ...

  8. java线程中断[interrupt()函数] (转载)

    一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...

  9. java之线程中断——interrupt

    如下图所示,interrupt()方法并没有成功的中断我们的线程. 为了便于理解,其实可以这样来类比(注意,只是类比,实际情况并不完全是这样):Thread类中有一个boolean的标志域用来表示线程 ...

随机推荐

  1. SQL Prompt 注册后隔一段时间莫名无法使用的处理

    https://blog.csdn.net/anyqu/article/details/88537197 以前一直以为是授权丢了,反复重装也解决不了 Sql Prompt---Unable to co ...

  2. 怎么处理sqlserver2017部署在winowsDocker上时区无法修改成功的方式,并且可以多创建新的容器调用简单的方式直接使用!

    在创建该容器的时候我们执行的语句中添加了一个 从图中所看到的内容,上海时区,按照正常流程一般都是可疑正常执行的,但最后事情并不是我们所想的那么简单. 我们进入对应的容器里面 ,执行语句之后查找对应的文 ...

  3. BIOS将MBR读入0x7C00地址处(x86平台下)

    BIOS将MBR读入0x7C00地址处(x86平台下) https://www.cnblogs.com/jikebiancheng/p/6193953.html http://www.ruanyife ...

  4. SpringCloud 随笔

    目录 服务间通讯 统一配置中心 RabbitMQ Spring Cloud Stream 服务网关 Spring Cloud Zuul ++==(纯手打,代码可能有错!)==++ 服务间通讯 Rest ...

  5. js之数据类型(对象类型——构造器对象——日期)

    Date对象是js语言中内置的数据类型,用于提供日期与时间的相关操作.学习它之前我们先了解一下什么是GMT,什么时UTC等相关的知识. GMT: 格林尼治标准时间(Greenwich Mean Tim ...

  6. GSM AT指令 SIM900A TC35

    http://download.csdn.net/download/zhangxuechao_/9911264 短信 TEXT格式 设置短消息中心号码: AT+CSCA="+86130101 ...

  7. Linux软链接创建及删除

    1.创建软链接 具体用法是:ln  -s   [源文件]   [软链接文件]. [root@localhost folder]# pwd /tmp/folder [root@localhost fol ...

  8. static{}静态代码块与{}普通代码块之间的区别

    先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...

  9. 【JAVA各版本特性】JAVA 1.0 - JAVA 12

    make JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.119 ...

  10. Flutter——Row组件(水平布局组件)

    Row组件的常用属性 属性 说明 mainAxisAlignment 主轴的排序方式 crossAxisAlignment 次轴的排序方式 children 组件子元素 import 'package ...