当前位置: 首页 > news >正文

二、中断线程

为什么80%的码农都做不了架构师?>>>   hot3.png

在说明之前先介绍一些关于中断的情况

第一、线程终止满足以下情况任意一种即可:

1、run方法体执行完最后一条语句

2、run方法中由return语句返回时

3、捕获到异常,catch中结束时或出现未捕获异常时

第二、与Thread中断相关的api有:stop与suspend已经不建议使用不再分析,为了稳定性,也建议大家不要使用

public void interrupt()
public static native boolean interrupted();
public static native boolean isInterrupted();

这三个API很相似,看着很晕,但是都是围绕Thread的一个属性来说的,有一个boolean类型的属性来表明线程是否被中断。

interrupt()方法返回void,将该属性置为true,并发送一个信号,睡眠会被提前终止,想起Thread的sleep方法了吗?sleep中,如果调用该方法,会直接抛出异常,终止睡眠,意图尽早结束程序,这也是该方法本质

interrupted()方法返回当前该属性的状态,后将该属性置为false,清除线程的中断状态

isInterrupted()仅仅返回该属性

可以看出这些api都不会使线程中断,而只是改变一个属性值,中断需要自己去操作

下面进入正题,如何中断线程:

1、使用interrupt()中断线程

看下面的例子

Thread thread1;
public void add(View view) {
    thread1=new Thread(new Task());
    thread1.start();
}

public void cancle(View view) {
    thread1.interrupt();
}

class Task implements Runnable{
    @Override
    public void run() {
        int a=0;
        while (!Thread.currentThread().isInterrupted()){

            a++;
            Log.e(tag,Thread.currentThread().getId()+":"+a);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Log.e(tag,Thread.currentThread().getId()+":"+a);
            }
        }
    }
}

然而当我点击取消时,发现没有任何作用,前面不是说interrupt()将状态置为true了吗,为什么循环还在继续?这是因为Thread.sleep在抛出InterruptedException前Java虚拟机会先将线程的中断标识位清除,因此只要在catch中再次调用interrupt(),就不会进入循环。

2、1的变体循环条件为while (!thread1.interrupted()),不过不建议这样,因为会改变那个布尔值,影响别处的操作

public void add(View view) {
    thread1=new Thread(new Task());
    thread1.start();
}

public void cancle(View view) {
    thread1.interrupt();
}

class Task implements Runnable{
    @Override
    public void run() {
        int a=0;
        while (!thread1.interrupted()){
            a++;
            Log.e(tag,Thread.currentThread().getId()+":"+a);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e(tag,Thread.currentThread().getId()+":"+a);
                Thread.currentThread().interrupt();
            }
        }
    }
}

3、除了1、2中的方法,还可以自己定义布尔变量,该变量必须定义为volatile,或者所有对它的访问必须同步(synchronized) (当然啦,单线程自控时可不用),但是自己定义的布尔类型不是受到interrupt()的影响,只能在下一次判断中停止,而不能更早的退出当前的阻塞状态。

转载于:https://my.oschina.net/wfy94/blog/863169

相关文章:

  • 看看近期读者的书评
  • 程序员需要的都在这里了
  • 浅谈我的销售体会(二)
  • Python正则表达式
  • 桃花庵
  • SwitchyOmega 设置修改代理
  • 【美食】去掉美女脸上斑点的八种饮食疗法
  • Android混淆打包
  • Ajax中动态执行返回到innerHTML中的js
  • css深入理解relative
  • 疯子张五常教授学英文的方法
  • 郑州尚学堂:Java培训:变量类型
  • C#加密解密方法
  • Js 的test方法
  • H5缓存
  • Google 是如何开发 Web 框架的
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 0基础学习移动端适配
  • 4. 路由到控制器 - Laravel从零开始教程
  • android图片蒙层
  • Angularjs之国际化
  • Idea+maven+scala构建包并在spark on yarn 运行
  • iOS小技巧之UIImagePickerController实现头像选择
  • java概述
  • Laravel Telescope:优雅的应用调试工具
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Wamp集成环境 添加PHP的新版本
  • 前端自动化解决方案
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 深入浅出webpack学习(1)--核心概念
  • 算法-图和图算法
  • 微信小程序填坑清单
  • 《码出高效》学习笔记与书中错误记录
  • MPAndroidChart 教程:Y轴 YAxis
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (10)STL算法之搜索(二) 二分查找
  • (12)Linux 常见的三种进程状态
  • (Python第六天)文件处理
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (论文阅读11/100)Fast R-CNN
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • *1 计算机基础和操作系统基础及几大协议
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 中创建支持集合初始化器的类型
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [C语言]编译和链接