说说Interrupt的作用?

1、唤醒处于等待状态的线程

2、修改中断的标记false=true

我们平时在线程中使用的sleep、wait、join等操作,它都会抛出一个InterruptedException异常,为什么会抛出异常,是因为它在阻塞期间,必须要能够响应被其他线程发起的中断请求,而这个响应是通过InterruptedException来体现的。但是这里需要注意的是,在这个异常中如果不做任何处理的话,我们是无法去中断线程的,因为当前的异常只是响应了外部对于这个线程的中断命令,同时,线程的中断状态也会复位,如果需要中断,则还需要在catch中再次调用中断方法。

代码示例:

public class InterruptDemo {
  private static int i;
  public static void main(String[] args) throws InterruptedException {
    Thread thread=new Thread(()->{
      while(!Thread.currentThread().isInterrupted()){
        try {
          TimeUnit.SECONDS.sleep(1);
       } catch (InterruptedException e) {
          e.printStackTrace();
          Thread.currentThread().interrupt(); //再次中断
       }
     }
      System.out.println("Num:"+i);
   },"interruptDemo");
    thread.start();
    TimeUnit.SECONDS.sleep(1);
    thread.interrupt();
    System.out.println(thread.isInterrupted());
 }
}

所以,InterruptedException异常的抛出并不意味着线程必须终止,而是提醒当前线程有中断的操作发生,至于接下来怎么处理取决于线程本身,比如

1. 直接捕获异常不做任何处理 //当前线程不会中断

2. 将异常往外抛出 //当前线程会中断(catch中出现运行时异常)

3. 停止当前线程,并打印异常信息 //当前线程会中断

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值