java中断线程的两种方式

方式一:使用interrupt

Thread.currentThread().isInterrupted() :判断当前线程是否有中断标记,不会清除中断标记
Thread.interrupted():判断当前线程是都有中断标记,会清除中断标记
复制代码
public static void main(String[] args) {
        MyRunable myRunable = new MyRunable();
        Thread thread = new Thread(myRunable);
        thread.start();
        for (int i = 0;i < 50;i++){
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try {
                Thread.sleep(300);          //线程休眠,会让出cpu时间片(让同一进程中其余线程占用cpu时间片)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(i == 20){
                thread.interrupt();             //在自定义线程上打了一个中断标记
            }
        }
    }
复制代码
复制代码
class MyRunable implements Runnable{

    @Override
    public void run() {
        for (int i = 0;i< 50;i++){
            if(Thread.interrupted()){      //interrupted方法会清除中断标记
                break;
            }
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try {
                Thread.sleep(300);        //sleep方法也会清除中断标记并报错
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();        //在报错的地方继续添加中断标记在循环判断的时候会中断该循环
            }
        }
    }
}
复制代码

方式二:使用中断标记(更常用,更好理解)

复制代码
public static void main(String[] args) {
        MyRunable myRunable = new MyRunable();
        Thread thread = new Thread(myRunable);
        thread.start();
        for (int i = 0;i < 50;i++){
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(i == 20){
                myRunable.flag = false;
            }
        }
    }
复制代码
复制代码
class MyRunable implements Runnable{
    public boolean flag = true;
    
    @Override
    public void run() {
        int i = 0;
        while (flag){
            System.out.println(Thread.currentThread().getName()+"-"+(i++));
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

 线程的状态:在标红的三个状态下线程才会抛出 InterruptedException 异常

复制代码
public enum State {
        NEW,

        RUNNABLE,

        BLOCKED,

        WAITING,

        TIMED_WAITING,

        TERMINATED;
    }
复制代码

 

posted @   曹伟666  阅读(211)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示