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;
        }
    }
}
运行结果

Java多线程系列 基础篇04 线程中断的更多相关文章
- Java多线程系列--“基础篇”04之 synchronized关键字
		
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
 - Java多线程系列 基础篇02 线程的创建和运行
		
1.线程创建的方式常用有两种 1. 继承 Thread 类创建线程 2. 实现 Runnable 接口创建线程 2.Thread 和 Runnable的区别 Thread和Runnable的相同点:都 ...
 - Java多线程系列 基础篇01 线程的状态
		
1.进程和线程 进程: 计算机中程序关于某数据集合的一次运行活动,是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程: 线程是进程的实例,是CPU进行资源分配和调度的最小单位,线程 ...
 - Java多线程系列  基础篇03 线程的优先级和守护线程
		
1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...
 - Java多线程系列--“基础篇”05之 线程等待与唤醒
		
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
 - Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
		
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
 - Java多线程系列--“基础篇”06之 线程让步
		
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
 - Java多线程系列--“基础篇”07之 线程休眠
		
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
 - Java多线程系列--“基础篇”10之 线程优先级和守护线程
		
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
 
随机推荐
- VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
			
VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...
 - Drools环境搭建
			
Eclipse3.5安装Drools6.5.0.Final插件 到Drools下载页面(现在是http://www.jboss.org/drools/downloads.html) -下载并解压Dro ...
 - 一款很实用的Memcache监控工具
			
装了memcahce以后想对使用情况详细了解一下,如分配的内存够不够,都存了什么,经百度后发现这款工具灰常实用!此工具来自Memcache Pecl 中 http://pecl.php.net/pac ...
 - HDU5294——Tricks Device(最短路 + 最大流)
			
第一次做最大流的题目- 这题就是堆模板 #include <iostream> #include <algorithm> #include <cmath> #inc ...
 - shell脚本实现定时重启进程
			
##############################Deploy crontab for yechang ad*******eta restart ###################### ...
 - Java IDL与javaRMI
			
Registry registry = LocateRegistry.getRegistry(); registry.rebind(RemoteService.name, stub); Java 平台 ...
 - PHP实现上次登录功能
			
通过一个sql语句把上次的登录时间给本次登录时间,再把当前时间记录下来 update userinfo set lasttime=userinfo.logintime,logintime= CURR ...
 - UbuntuServer12.04安装MongoDB,开机自启,服务,权限
			
获取最新版本 去http://www.mongodb.org/downloads找最新版的链接 wget http://fastdl.mongodb.org/linux/mongodb-linux-x ...
 - python创建迅雷批量任务
			
其实不是真的创建了批量任务,而是用python创建一个文本文件,每行一个要下载的链接,然后打开迅雷,复制文本文件的内容,迅雷监测到剪切板变化,弹出下载全部链接的对话框~~ 实际情况是这样的,因为用py ...
 - C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
			
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...