为什么要中断?

根据需要停止某些持续的方法,这些方法可以被中断,所以又被称为可中断方法,包括:

Object的wait(), wait(long), wait(long, int),

Thraed的sleep(long), sleep(long, int), join(), join(long), join(long, int),

InterruptibleChannel的io操作,

Selector的wakeup方法,

其他方法。

如何中断?

Thread的三个方法:

方法 功能 特点
public void interrupt() 中断当前线程 更新中断标记为true,抛出InterruptedException
public void static boolean isInterrupted() 检查线程中断标记 返回查中断标记,可用于判断是否被调用中断
public boolean interrupted() 检查线程中断标记,可能更新 返回中断标记,若为true则更新为false。

当线程被中断时,会将中断标记置为true,并抛出InterruptedException异常,当捕获到这个异常时,说明当前线程的中断方法被调用。

如果在可中断方法执行前,调用了interrupt()方法,那么当执行到可中断方法时,会立刻抛出InterruptedException。

线程中catch (InterruptedException ex)会导致中断标志被擦除。

示例

interrupt:

public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread() {
@Override
public void run() {
while (true) {
try {
TimeUnit.MINUTES.sleep(2);
} catch (InterruptedException ex) {
System.out.println("I am interrupted"); } }
}
}; thread.start();
TimeUnit.MICROSECONDS.sleep(2);
thread.interrupt();
}
output:
I am interrupted

interrupted:

public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread() {
@Override
public void run() {
while (true) {
//移除sleep和try-catch,因为可中断方法中断时,会将中断标志置为false
}
}
}; thread.start();
TimeUnit.MICROSECONDS.sleep(2);
System.out.println("before invoke interrupte,thread is interrupted:" + thread.isInterrupted());
thread.interrupt();
System.out.println("after invoke interrupte is interrupted:" + thread.isInterrupted());
}
output:
before invoke interrupte,thread is interrupted:false
after invoke interrupte is interrupted:true

iterrupted

public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("thread is interrupted:" + Thread.interrupted());
}
}
};
thread.setDaemon(true);
thread.start();
TimeUnit.MICROSECONDS.sleep(2);
System.out.println("before invoke interrupte,thread is interrupted:" + thread.isInterrupted());
thread.interrupt();
System.out.println("after invoke interrupte is interrupted:" + thread.isInterrupted());
TimeUnit.MICROSECONDS.sleep(1);
System.out.println("finally thread is interrupted:" + thread.isInterrupted()); }

输出:

output:
thread is interrupted:false
before invoke interrupte,thread is interrupted:false
thread is interrupted:false
after invoke interrupte is interrupted:true
thread is interrupted:true
thread is interrupted:false
finally thread is interrupted:false

可中断方法执行前调用interrupt

public static void main(String[] args) {

        System.out.println("thread is interrupted:" + Thread.interrupted());

        Thread.currentThread().interrupt();
System.out.println("after interrupt,do something...");
try {
TimeUnit.MICROSECONDS.sleep(2);
}
catch (InterruptedException e) {
System.out.println("thread is interrupted:" + Thread.currentThread().isInterrupted());
}
}

输出:

thread is interrupted:false
after interrupt,do something...
thread is interrupted:false

Java interrupt 中断的更多相关文章

  1. 用interrupt()中断Java线程

    最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...

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

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

  3. Java线程中断的本质深入理解(转)

    一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...

  4. Java 并发 中断线程

    Java 并发 中断线程 @author ixenos 对Runnable.run()方法的三种处置情况 1.在Runnable.run()方法的中间中断它 2.等待该方法到达对cancel标志的测试 ...

  5. 一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  6. Java线程中断的本质深入理解

    Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己. 一.Java中断的现象 首先,看看Thread类里的 ...

  7. JAVA interrupte中断线程的真正用途

    Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...

  8. Java阻塞中断和LockSupport

    在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? ...

  9. Interrupt中断线程注意点

    首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定. 这就是和stop()不一样的地方,stop执行后线程会立即终止,这 ...

  10. java线程中断

    public void Thread.interrupt() // 无返回值 public boolean Thread.isInterrupted() // 有返回值 public static b ...

随机推荐

  1. 发布npm包,全局安装可命令行使用

    发布自己的npm包 打个广告 我写的例子 npm包 codefilecount 统计文件个数和代码行数 npm init 初始化项目 修改 package.json { "name" ...

  2. 安防摄像头云端录像计划快捷配置-LiveNVR Onvif/RTSP流媒体服务

    LiveNVR Onvif/RTSP流媒体服务,支持RTSP稳定拉流接入,支持Onvif协议接入,支持RTMP/HLS/HTTP-FLV分发,将传统安防监控设备互联化,无插件直播等. 录像计划 什么是 ...

  3. 【干货】这些Claude Code使用技巧对你应该有用

    前言 Claude Code两脚踢翻cursor,现阶段已经是最牛逼的AI工具了,这篇文章来聊聊我的Claude Code使用技巧,可能对你有用. 关注公众号:[前端欧阳],加入我的AI交流群. 注册 ...

  4. BOE(京东方)“向新2025”年终媒体智享会落地深圳 “屏”实力赋能产业创新发展

    12月27日,BOE(京东方)"向新 2025"年终媒体智享会的收官之站在创新之都深圳圆满举行,为这场为期两周.横跨三地的年度科技盛会画上了完美句号.活动期间,全面回顾了 BOE( ...

  5. U3D动作游戏开发读书笔记--2.1一些通用的预备知识

    2.1 一些通用的预备知识: 2.1.1 使用协程分解复杂逻辑 试想一下如何实现一个简单的NPC人物行为,例如是村民.村民饿了会去吃饭,困倦了会去睡觉.上来上一个状态机?其实用不着这么复杂,可以使用协 ...

  6. 详解Docker 跨服务器通讯 Ambassador原理

    先看拓扑图:Ambassador 主要用来解决跨服务器通讯,因为同服务器通讯相对简单,直接用--link参数,或者用bridge网络即可. 服务器B的Docker2:centos想要访问服务器A的Do ...

  7. 精品战略与长期主义,如何为OPPO赢得市场

    过去几年,是智能手机发展的一个盘整期,整个产业创新乏力,市场增长停滞.元旦前后,各大厂商集中发布新款,手机迎来集中热销.战报显示,该轮大促对市场的激活作用十分可观,或将开启新一轮的增长. OPPO近几 ...

  8. 直播插件-hls.js

    video标签是不能直接使用直播流的来播放的,需要使用hls转码过后才能播放 测试直播链接:https://live.cgtn.com/1000/prog_index.m3u8 hls.js是一个可以 ...

  9. set_multicycle_path的使用

    在设计中有时会碰到部分难以优化的大块组合逻辑,例如我们这次的设计中调用了DW的浮点sqrt的IP,尽管在综合时,工具已经最大effort去简化逻辑,路径上的cell已经基本上全都ulvt了,timin ...

  10. VPX处理板设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 C6678板卡, XC7VX690T板卡, VPX处理板

    基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 一.概述 本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发.板卡采用一片TI DSP ...