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

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

线程中断:

首先线程在未正常结束之前,被强制终止是很危险的事,会造成意想不到的后果。

但有时想让一个线程结束,或者结束某种等待的状态,该咋办?

使用等待/通知机制或者给那个线程一个中断信号,让它自己决定该怎么办?


 

中断使用的场景:

  1.线程为了等待一些特定的资源的到来,调用了Thread.sleep(10000), 让自己10秒后醒过来,但是如果这些特定条件提前到来,来通知处于sleep状态的线程,“嘿老兄,别再睡了”。

  2.线程通过调用子线程的join方法阻塞自己等待子线程结束,但是子线程运行过程中发现自己在短时间内没法结束,所以它要通知主线程,别再等待子线程了。

  这些情况下,就需要中断。


 

中断的函数:

  

  Thread.interrupt()方法来做的。

  比如A线程调用了这个方法,这个方法就修改了A线程的中断状态。

  在非阻塞的线程中

  这个方法修改中断状态只是改变了线程中的一个布尔变量的值,在线程体run()方法中调用Thread.CurrendThread().isInterrupt()这个方法,会返回一个true

  在可取消阻塞状态的线程中,比如线程run()方法内调用了Thread.sleep()Thread.join()Object.wait()这些方法的线程处于等待的过程中。这个线程调用了interrupt()方法,然后这个线程的Thread.CurrendThread().isInterrupt()的值会改变成true。这个线程收到中断信号后,会抛出InterruptedException异常。

非阻塞状态的线程中:

public class Interrupt {    public static void main(String[] args) {       // Interrupt interrupt=new Interrupt();        ThreadC threadC=new ThreadC();        threadC.start();        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        threadC.interrupt();    }}class ThreadC extends Thread{    public void run(){        while(true){            if (Thread.currentThread().isInterrupted()){                System.out.println("Someone interrupt me");            }else{                System.out.println("Thread is Going ...");            }        }    }}

运行结果: 

 

 

 

结果分析:

  main方法中线程threadC 开始执行,threadC线程此时没有被中断,不断输出 Thread is Going

  在main线程睡眠3秒结束后,执行了threadC.interrupt()方法,中断线程,此时Thread.currentThread().isInterrupted()的值成为了true。但是线程却不会停止,会不断的输出Someone interrupt me,它只是被修改了一个中断信号。

  当在main方法中调用threadC.interrupt()方法的时候,线程threadC的中断状态(interrupted status )会被置位,然后在线程体内通过Thread.currentThread().isInterrupted()来检查这个布尔变量的中断状态。

阻塞状态的线程:

 

public class Interrupt {    public static void main(args[]){
     ThreadD threadD=new ThreadD(); threadD.start(); System.out.println("线程开始执行"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("中断线程"); threadD.interrupt(); }}class ThreadD extends Thread{ boolean stop=false; public void run(){// while(!stop){// System.out.println("Thread is Going ...");// } try { Thread.sleep(3000); } catch (InterruptedException e) { System.out.println("线程睡眠被中断"); } System.out.println("线程继续执行..."); }}

 

运行结果:

 

结果分析:

如果线程被Object.warit()Thread.sleep()Thread.join()方法阻塞,调用该线程的interrupt()方法的时候会 抛出InterruptException异常,从而提早的结束阻塞状态。

线程睡眠3秒,main方法睡眠2秒后执行threadD.interrupt()方法。此时线程会抛出异常,结束睡眠。

 


 

 

其它:

  不是所有阻塞方法收到中断后都可以取消阻塞状态,输入和输出类会阻塞等待IO完成,但是它们不会抛出interruptedException,而且在被中断的时候也不会退出阻塞状态。

  synchronized在获锁的过程中是不能被中断的。

但是 ReentrantLock 支持可中断的获取模式即 tryLock(long time, TimeUnit unit)

 

转载于:https://www.cnblogs.com/xuesheng/p/7943584.html

你可能感兴趣的文章
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
SVN与TortoiseSVN实战:补丁详解(转)
查看>>
Win8换成Win7系统问题小结(修改主板BIOS方法)
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
文件上传的两种方式
查看>>
使用Redis存储Nginx+Tomcat负载均衡集群的Session
查看>>
Hive 锁处理
查看>>
【IL】IL生成exe的方法
查看>>
leetcode------Triangle
查看>>
network
查看>>
测试工程师速成手册
查看>>
实验一 查看CPU和内存,用机器指令和汇编指令编程
查看>>
Hibernate---->component映射和复合主键映射
查看>>
sp_addlinkedserver '(null)' is an invalid product name
查看>>
Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable
查看>>
PHP CURL模拟提交数据 攻击N次方
查看>>
Apache Shiro 使用手册(四)Realm 实现
查看>>
从Knockout到Angular的架构演变
查看>>
数据库技术进化路线
查看>>