玉溪
玉溪查发分类 > 玉溪教育培训 > 玉溪IT培训 > 玉溪软件开发

云南java培训分享线程的中断分为哪些情况

2019-05-10 184) 喜欢:(4) 举报/删帖 喜欢

软件开发 

玉溪

zdljp

业务描述

  相信大家在使用电脑的时候都有过这样的现象,就是在运行一个程序的时候,突然发现不需要了或者是需要启用其他软件的时候,我们会强制关闭这个软件的启动过程,云南java培训http://www.kmbdqn.com/认为这个行为在java编程开发中就叫做线程的中断。
  
  每…
查看更多 一个线程都有一个boolean类型标志,用来表明当前线程是否请求中断,当一个线程调用interrupt()方法时,线程的中断标志将被设置为true。
  
  我们可以通过调用Thread.currentThread().isInterrupted()或者Thread.interrupted()来检测线程的中断标志是否被置位。这两个方法的区别是
  
  Thread.currentThread().isInterrupted()是线程对象的方法,调用它后不清除线程中断标志位;而Thread.interrupted()是一个静态方法,调用它会清除
  
  线程中断标志位。
  
  一般来说中断线程分为三种情况:
  
  (一):中断非阻塞线程
  
  (二):中断阻塞线程
  
  (三):不可中断线程
  
  (一):中断非阻塞线程
  
  中断非阻塞线程通常有两种方式:
  
  (1)采用线程共享变量
  
  这种方式比较简单可行,需要注意的一点是共享变量必须设置为volatile,这样才能保证修改后其他线程立即可见。
  
  (2)采用中断机制
  
  (二):中断阻塞线程
  
  当线程调用Thread.sleep()、Thread.join()、object.wait()再或者调用阻塞的i/o操作方法时,都会使得当前线程进入阻塞状态。那么此时如果在线程处于阻塞状态是调用
  
  interrupt()方法设置线程中断标志位时会出现什么情况呢!此时处于阻塞状态的线程会抛出一个异常,并且会清除线程中断标志位(设置为false)。这样一来线程就能退出
  
  阻塞状态。当然抛出异常的方法就是造成线程处于阻塞状态的Thread.sleep()、Thread.join()、object.wait()这些方法。
  
  需要注意的地方就是Thread.sleep()、Thread.join()、object.wait()这些方法,会检测线程中断标志位,如果发现中断标志位为true则抛出异常并且将中断标志位设置为false。
  
  所以while循环之后每次调用阻塞方法后都要在捕获异常之后,调用Thread.currentThread().interrupt()重置状态标志位。
  
  (三):不可中断线程
  
  有一种情况是线程不能被中断的,就是调用synchronized关键字和reentrantLock.lock()获取锁的过程。
  
  但是如果调用带超时的tryLock方法reentrantLock.tryLock(longtimeout,TimeUnitunit),那么如果线程在等待时被中断,将抛出一个InterruptedException异常,这是一个非常
  
  有用的特性,因为它允许程序打破死锁。你也可以调用reentrantLock.lockInterruptibly()方法,它就相当于一个超时设为无限的tryLock方法。

温馨提示:该信息是用户发布,其真实,合法,有效性由发布者负责。在咨询,交易或者签订合同时,任何要求预付定金,保证金,意向金或要求网上转账等行为都可能存在交易风险,谨防上当受骗。
<

玉溪软件开发推荐