zoukankan      html  css  js  c++  java
  • Java多线程系列 基础篇04 线程中断

    1. 中断线程

    中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作,其他线程通过调用该线程的interrupt()方法对其进行中断操作,线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupt()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标志位进行复位,如果该线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的isInterrupted()时依旧会返回false。

    2. 终止处于“阻塞状态”的线程和终止处于“运行状态”的线程

    /**
     * @Description: 线程中断示例
     * @Author: lizhouwei
     * @CreateDate: 2018/5/20  21:11
     * @Modified By:
     */
    public class ThreadInterruptDemo {
    
        public static void main(String[] args) {
            //sleepThread线程不停的尝试睡眠
            Thread sleepThread = new Thread(new SleepRunner(), "sleepThread");
            sleepThread.setDaemon(true);
            //busyThread不停的运行
            Thread busyThread = new Thread(new BusyRunner(), "busyThread");
            busyThread.setDaemon(true);
            sleepThread.start();
            busyThread.start();
            //主线程睡眠5秒,让sleepThread 和busyThread 充分的运行
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            sleepThread.interrupt();//中断阻塞的线程
            busyThread.interrupt();//中断正在运行的线程
    
            System.out.println("sleepThread interrupt is " + sleepThread.isInterrupted());
            System.out.println("busyThread interrupt is " + busyThread.isInterrupted());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("1");
                e.printStackTrace();
            }
        }
    
        static class SleepRunner implements Runnable {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        static class BusyRunner implements Runnable {
    
            @Override
            public void run() {
                while (true) {
                }
            }
        }
    }
    


    从结果可以看出,抛出InterruptException 的是被阻塞的线程SleepThread,其中断标志先被设置为true,随后被复位并抛出异常,而正在运行的线程BusyThread,中断标志位没有没被清除。

    安全的终止线程

    除了使用中断以外,还可以利用一个boolean变量来控制十五终止该线程。
    代码示例:

    /**
     * @Description: 使用boolean变量安全的终止线程
     * @Author: lizhouwei
     * @CreateDate: 2018/7/1 20:56
     * @Modified By:
     */
    public class ThreadShutdownDemo {
    
        public static void main(String[] args) {
            Runner oneRunner = new Runner();
            Thread oneThread = new Thread(oneRunner, "oneThread");
            oneThread.start();
            //主线程睡眠1秒,主线程对oneThread 线程进行中断,使oneThread能够感知中断而结束
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            oneThread.interrupt();
    
            Runner twoRunner = new Runner();
            Thread twoThread = new Thread(twoRunner, "twoThread");
            twoThread.start();
            //主线程睡眠1秒,主线程对twoThread 线程进行中断,使twoThread能够感知中断而结束
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            twoRunner.cancel();
        }
    
        private static class Runner implements Runnable {
    
            private long i;
            private volatile boolean running = true;
    
            @Override
            public void run() {
    
                while (running && !Thread.currentThread().isInterrupted()) {
                    i++;
                }
                System.out.println("count i = " + i);
            }
    
            public void cancel() {
                running = false;
            }
    
        }
    }
    

    运行结果

  • 相关阅读:
    ABP 前端 组件之间传递参数的几种方式
    angular Form 自定义验证
    Docker 启用失败 failed to start docker Application container Engin
    C# 委托与事件
    c# Application.DoEvents()
    c# 泛型
    Ubuntu如何挂载U盘
    jdk1.8 List根据时间字段倒序排序
    yarn安装模块报错:check python checking for Python executable "python2" in the PATH
    yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/9064582.html
Copyright © 2011-2022 走看看