• Java——》线程的打断(停止正在运行的线程)


    推荐链接:
        总结——》【Java】
        总结——》【Mysql】
        总结——》【Redis】
        总结——》【Kafka】
        总结——》【Spring】
        总结——》【SpringBoot】
        总结——》【MyBatis、MyBatis-Plus】
        总结——》【Linux】
        总结——》【MongoDB】
        总结——》【Elasticsearch】

    Java——》线程的打断(停止正在运行的线程)

    一、设置标志位

    如果线程的run方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否继续。

    package com.xiaoxian.demo.thread.interrupt;
    
    import java.util.Date;
    
    public class ThreadInterrupt01 {
        /**
         * 设计一个线程:运行10秒后被终止(掌握线程的终止方法)
         * @param args
         */
        public static void main(String[] args) throws Exception {
            MyRunable01 runnable = new MyRunable01();
            new Thread(runnable).start();
            Thread.sleep(10000); // 主线程休眠10秒钟
            runnable.flag = false;
            System.out.println("main、  end ...");
        }
    }
    
    class MyRunable01 implements Runnable {
    
        boolean flag = true;
    
        @Override
        public void run() {
            while (flag) {
                try {
                    Thread.sleep(1000);
                    System.out.println(new Date());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + " 执行完成");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    二、利用中断标志位

    在线程中有个中断的标志位,默认是false,当我们显示的调用 interrupted方法或者isInterrupted方法是会修改标志位为true,我们可以利用此来中断运行的线程。

    package com.xiaoxian.demo.thread.interrupt;
    
    public class ThreadInterrupt02 extends Thread {
    
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new ThreadInterrupt02();
            t1.start();
            Thread.sleep(3000);
            t1.interrupt(); // 中断线程 将中断标志由false修改为了true
            // t1.stop(); // 直接就把线程给kill掉了
            System.out.println("main .... ");
        }
    
        @Override
        public void run() {
            System.out.println(this.getName() + " start...");
            int i = 0;
            // Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
            while (!Thread.interrupted()) {
                System.out.println(this.getName() + " " + i);
                i++;
            }
    
            System.out.println(this.getName() + " end .... ");
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    三、利用InterruptedException

    如果线程因为执行join(),sleep()或者wait()而进入阻塞状态,此时要想停止它,可以让他调用interrupt(),程序会抛出InterruptedException异常。我们利用这个异常可以来终止线程。

    package com.xiaoxian.demo.thread.interrupt;
    
    public class ThreadInterrupt03 extends Thread {
    
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new ThreadInterrupt03();
            t1.start();
            Thread.sleep(3000);
            t1.interrupt(); // 中断线程 将中断标志由false修改为了true
            // t1.stop(); // 直接就把线程给kill掉了
            System.out.println("main .... ");
        }
    
        @Override
        public void run() {
            System.out.println(this.getName() + " start...");
            int i = 0;
            // Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
            while (!Thread.interrupted()) {
                //while(!Thread.currentThread().isInterrupted()){
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
                System.out.println(this.getName() + " " + i);
                i++;
            }
    
            System.out.println(this.getName() + " end .... ");
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    【深度学习】实验12 使用PyTorch训练模型
    中断处理过程的压栈问题
    数据库概念介绍
    k8s 部署filebeat sidecar模式之nginx测试
    pinpoint接入及接入tomcat
    短视频短剧小程序系统:创新的内容传播与互动体验
    驱动开发day1
    HTB靶场之Sandworm
    机器学习模型监控清单
    社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD
  • 原文地址:https://blog.csdn.net/weixin_43453386/article/details/133139465