Java线程中断(java线程中断的原因)

  本篇文章为你整理了Java线程中断(java线程中断的原因)的详细内容,包含有java线程中断方法 java线程中断的原因 java线程中断异常 java线程中断后重新启动 Java线程中断,希望能帮助你了解 Java线程中断。

  改进生产效率的原动力却是懒惰,是的,懒惰催人奋进!

  而我的理想世界是:棒打狍子瓢舀鱼,野鸡飞到饭锅里!

  
Java线程里:“中断”就是指“终止”,与操作系统里的"中断"、“异常”是完全不同的概念;
 

  由于stop()方法过于暴力,可能导致资源回收无法风险、开销过大等问题,此方法已过期,故Java中没有强制中断线程的手段;但可以调用interupt()、interupted()方法来向进程提出中断请求,待进程自行处理,这是一种更优雅的中断方式。

  注意:当需要中断线程时,最佳实践就是利用线程的中断位,而不是自定义中断状态,因为当线程被阻塞时,原生中断位仍然会被监听,而自定义的则不能。

  以下两类场景会应用到线程中断:

  
用来打断正在阻塞的线程:阻塞在sleep/wait/join等方法上、 阻塞在io-channel读写操作上、阻塞在io-channel-selector上。

  
打断正常执行的线程:需要在目标线程内部检测中断位,并由用户手动终止,来做出响应。

  
interrupt()
 

  实例方法,在线程内外都可发起调用;其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。)作用与正常线程会将中断标记设置为true,但是作用于阻塞线程会将中断标志刷新false(中断标记默认为false,刷新就是重新刷会默认)。

  
interrupted()
 

  静态方法,只能在线程内部调用;作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false。

  


public static void main(String[] args) throws InterruptedException {

 

   Thread thread = new Thread(() - {

   while (true) {

   System.err.println("子线程");

   thread.start();

   System.out.println("---" + thread.isInterrupted()); // ---false

   * 这主线程只是改变了子线程的中断位改为了true

   * 由于子线内部并没有就中断位进行检测和处理,故子线程并不会终止,会无限打印下去

   thread.interrupt();

   TimeUnit.SECONDS.sleep(1);

   System.err.println("===" + thread.isInterrupted()); // ===true

  

 

  在非阻塞线程内部手动响应中断:

  

public static void main(String[] args) throws InterruptedException {

 

   Thread thread = new Thread(() - {

   while (!Thread.currentThread().isInterrupted()) {

   System.out.println(Thread.currentThread().isInterrupted());

   System.err.println("子线程");

   thread.start();

   System.out.println("---" + thread.isInterrupted()); // ---false

   * 这主线程只是改变了子线程的中断位改为了true

   TimeUnit.SECONDS.sleep(3);

   thread.interrupt();

   System.err.println("===" + thread.isInterrupted()); // ===true

  

 

  在非阻塞线程内部手动响应中断:

  

/**

 

   * 当子线程需要响应主线程的中断请求,而停止时。可以通过在子线程中实时检测其自身的中断状态来达到停止的目的

   * @param args

  public static void main(String[] args) throws InterruptedException {

   Thread thread = new Thread(() - {

   // 实时检测自身中断状态

   while (!Thread.currentThread().isInterrupted()) {

   System.err.println("子线程");

   thread.start();

   TimeUnit.SECONDS.sleep(2);

   // 修改子线程的中断状态

   thread.interrupt();

  

 

  中断阻塞中的线程:

  

public static void main(String[] args) throws InterruptedException {

 

   Thread thread = new Thread(() - {

   while (!Thread.currentThread().isInterrupted()) {

   try {

   TimeUnit.SECONDS.sleep(5);

   } catch (InterruptedException e) {

   // 异常被捕获后,阻塞被打破、中断位被设为false,所以异常中永远输出false

   System.out.println("2 ----" + Thread.currentThread().isInterrupted()); // 2 ----false

   System.err.println("回收资源");

   e.printStackTrace();

   System.err.println("子线程逻辑");

   thread.start();

   TimeUnit.SECONDS.sleep(1);

   thread.interrupt();

   System.out.println(thread.isInterrupted()); // true

   TimeUnit.SECONDS.sleep(5);

  

 

  优雅中断非阻塞线程:

  

public static void main(String[] args) throws InterruptedException {

 

   Thread thread = new Thread(() - {

   while (true) {

   if (Thread.interrupted()) {

   System.out.println("清理资源");

   break;

   System.err.println("子线程逻辑");

   thread.start();

   TimeUnit.SECONDS.sleep(1);

   thread.interrupt();

  

 

  以上就是Java线程中断(java线程中断的原因)的详细内容,想要了解更多 Java线程中断的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: