线程的interrupt()
官网解释
If this thread is blocked in an invocation of the
wait()
,wait(long)
, orwait(long, int)
methods of theObject
class, or of thejoin()
,join(long)
,join(long, int)
,sleep(long)
, orsleep(long, int)
, methods of this class, then its interrupt status will be cleared and it will receive anInterruptedException
.
意思是当线程被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()的更多相关文章
- Java 并发:线程中断-interrupt
一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...
- java线程的interrupt方法
java现成的interrupt方法比较容易误导新手,它其实是不会中断(停止)当前的线程,只是标志一下当前线程的某个状态值(中断标志位),并且这个状态为只对阻塞方法(比如说: ...
- 线程的Interrupt方法与InterruptedException解析
线程阻塞状态与等待状态(当一个线程处于被阻塞或等待状态时,它暂时不活动,不允许任何代码且消耗最少的资源) 当一个线程试图获得一个内部的对象锁(而不是java.util.concurrent库中的锁), ...
- 线程中断 interrupt 和 LockSupport
本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题: 线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗? 判断线程是否中断的方法有几个,它们之 ...
- 日积月累--线程中断interrupt()方法
线程中断方法interrupt()方法的理解: interrupt()方法的源码: interrupted()方法的源码及注解: isInterrupted()方法源码及注解: 在了解这个方法之前我们 ...
- 【杂谈】线程中断——Interrupt
前言 以前有一个错误的认识,以为中断操作都会抛出异常,后来才发现并不是这样,所以今天就来做一个关于中断的总结. 如何关闭线程 已被弃用的Stop方法 早期,Thread类中有一个stop方法,用于强行 ...
- Java线程停止interrupt()方法
程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 中 ...
- java线程中断[interrupt()函数] (转载)
一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...
- java之线程中断——interrupt
如下图所示,interrupt()方法并没有成功的中断我们的线程. 为了便于理解,其实可以这样来类比(注意,只是类比,实际情况并不完全是这样):Thread类中有一个boolean的标志域用来表示线程 ...
随机推荐
- Python 语言简介与入门
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 前端工程师应该知道的yarn知识
yarn 是在工作中离不开的工具,但在工作中,很多人基本只会使用 yarn install,而且会手动删除 node-modules,或删除 yarn.lock 文件等不规范操作.本文将从一些基础的知 ...
- 分布式全局ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等. 那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是 ...
- centeros7安装mysql
转载自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境:yum install -y perl perl-Module-Bu ...
- 12.SpringMVC核心技术-请求转发和重定向
默认情况下,跳转到指定的View,使用的是请求转发.也可以显示的进行指出 此时,需在setViewName() 指定的视图前添加 forword: , 且此时的视图不会再与视图解析器中的前缀和后缀进 ...
- C++手动调用析构函数无效问题排查
在学习C++的时候,都知道不要手动调用析构函数,也不要在构造函数.析构函数里调用虚函数.工作这么多年,这些冷门的知识极少用到,渐渐被繁杂的业务逻辑淹没掉. 不过,最近项目里出现了析构函数没有被正确地调 ...
- Celery 初步使用心得
一. 基本介绍 Celery是一个专注于实时处理和任务调度的分布式任务队列.所谓任务就是消息,消息中的有效载荷中包含要执行任务需要的全部数据. 使用Celery常见场景: Web应用.当用户触发的一个 ...
- 《浏览器工作原理与实践》<04>从输入URL到页面展示,这中间发生了什么?
“在浏览器里,从输入 URL 到页面展示,这中间发生了什么? ”这是一道经典的面试题,能比较全面地考察应聘者知识的掌握程度,其中涉及到了网络.操作系统.Web 等一系列的知识. 在面试应聘者时也必问这 ...
- linux入门常用指令3.安装mysql
下载安装包 MySQL-5.6.42-1.el6.x86_64.rpm-bundle_redhat [root@localhost src]# mkdir mysql [root@localhost ...
- PAT Basic 1049 数列的片段和 (20 分)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) ...