interrupt 中断线程

一、线程该如何停止

  1. 线程在执行完代码后可以自行停止
  2. 在线程运行时可以使用线程对象进行中断请求,使用interrupt方法设置线程请求中断状态,线程可以根据请求中断状态来判断自己是否需要响应中断请求,该如何响应中断请求。

二、线程请求中断后不一定需要停止

线程接收到了中断请求之后,可以自行处理中断请求,可以停止线程,也可以继续执行其他操作

三、线程中断 interrupt 详解

  1. interrupt()是Thread类的一个方法,thread.interrupt()会将中断状态设置为true;
  2. Thread.currentThread().isInterrupted() 获取当前中断状态状态
    • 在执行该方法之后,会返回中断状态,并且重置中断状态为false
  3. 线程请求中断之后,有两种情况会触发中断响应
    • 在线程中判断是否发生了中断,进行响应
    • 在sleep,wait时发生了请求中断,将会抛出异常,并且程序继续执行
    • 被中断线程可以自行决定如何处理中断

四、代码示例

package com.wujie.thread.interrupt;

/**
 * 中断线程
 * 线程调用 interrupt 方法,会修改线程的中断状态
 * 线程在运行的过程中可以判断中断状态进行线程终止或者别的操作
 *
 * 线程请求中断之后,有两种情况会触发中断响应
 * 1. 在线程中判断是否发生了中断,进行响应
 * 2. 在sleep,wait时发生了请求中断,将会抛出异常,并且程序继续执行
 * 被中断线程可以自行决定如何处理中断
 *
 */
public class Interrupt {

    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.start();

        myThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("发生了异常");
                e.printStackTrace();
            }
        });

        Thread.sleep(2000);
        myThread.interrupt();

    }

}


class MyThread extends Thread {

    @Override
    public void run() {
        for (;;) {
            // 在 run 方法中 sleep 需要捕获 InterruptedException
            // 在 sleep 时,线程进行设置中断状态,会导致 sleep 停止,抛出异常,并继续向下执行
            try {
                System.out.println("开始睡眠...");
                sleep(1000);
                System.out.println("结束睡眠...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("我正在运行...");

            // 判断是否有中断请求
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("我需要去做一些事情:比如停止或者去做别的事情");
            }

//            int x = 1 / 0;
        }
    }
}



posted @   Dragon-Li  阅读(183)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示