博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中断线程
阅读量:7117 次
发布时间:2019-06-28

本文共 1414 字,大约阅读时间需要 4 分钟。

hot3.png

        本文的内容全部来自Core Java 

        当线程的run方法执行完最后一条语句并return,或者出现了在方法中未捕获的异常时,线程将终止。

        interrupt()方法只是请求终止线程,当调用此方法时,线程的中断状态将被置位。每个线程都应该不时地检查这个标志,以判断线程是否被中断。

        当在一个被阻塞的线程(调用sleep或者wait)上调用interrupted方法时,阻塞调用将会被InterruptedException中断。

        没有任何一个语言方面的需求要求一个被中断的线程应该终止。中断一个线程不过是为了引起它的注意,被中断的线程可以决定如何响应中断。某些线程是如此重要以至于应该处理完异常后继续运行,而不是中断。更是,更普遍的情况是,线程将简单地将中断作为一个终止的请求。这种情况下线程的run方法具有如下形式:

        public void run(){

        try{
                        while(!Thread.currentThread().isInterrupted()&& more work to do){
                                do more work
                        }
        }catch(InterruptedException e){
                        // thread was interrupted during sleep or wait
        }finally{
            cleanup,if required
        }
        //exiting the run method terminates the thread
    }

    如果在每次迭代之后都调用sleep方法(或者其它的可中断方法),isInterrupted检测就没有用处也没有必要。如果在中断状态被置位时调用sleep方法,它不会休眠。相反,它将清除这一状态并抛出InterruptedException。因此,如果你的循环调用sleep,不要检测中断状态,而是如下所示捕获InterruptedException

        public void run(){

            try{
                while(more work to do){
                    do more work
                    Thread.sleep(delay);
                }
            }catch (InterruptedException e){
                //thread was interrupted during sleep or wait
            }finally{
                cleanup,if required
            }
            //exiting the run method terminates the thread
        }

      有时候InterruptedException被抑制在很低的层次上,比如:

        void mySubTask(){

            …
            try{
                sleep(dalay);
            }catch(InterruptedException e){
}
            ...
        }

    这时候有一种更好的解决办法:

void mySubTask(){

    …
        try{
            sleep(dalay);
        }catch(InterruptedException e){
            Thread.currentThread().interrupt();
      }
}

当然,最好的解决办法是:

void mySubTask() throws InterruptedException{

    …
        sleep(dalay);
        ...
}

转载于:https://my.oschina.net/u/272863/blog/92087

你可能感兴趣的文章
PowerShell 获取磁盘使用情况
查看>>
右击本地连接属性“出现意外错误”解决办法
查看>>
我的友情链接
查看>>
VMware Vsphere6.0的功能及版本升级方式介绍
查看>>
RAID 技术基础知识
查看>>
java 8 移除 Premgen区
查看>>
路由器密码破解
查看>>
同步和异步概念明确
查看>>
win7系统如何恢复或重装IE8浏览器
查看>>
Restart the Domain Controller in Directory Services Restore Mode Locally
查看>>
微软超融合私有云测试22-SCOM2016部署之导入SCOM管理包
查看>>
婚恋网站发展战略差劲 除了扯淡还是扯淡
查看>>
runtime讲解<二>
查看>>
识别垃圾链接诱饵的要点—是否对用户有用
查看>>
跨域PHP代理到本地后Vue 数据展示
查看>>
俞敏洪:我让女儿主动学习的秘密
查看>>
zabbix监控esxi主机
查看>>
JavaSE基础笔记十三
查看>>
以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的节点之前...
查看>>
JsonCpp第一课 数据读取
查看>>