java线程的打断状态和interrupt()、isInterrupted()、static interrupted()方法辨析

编程入门 行业动态 更新时间:2024-10-12 10:30:49

java<a href=https://www.elefans.com/category/jswz/34/1771240.html style=线程的打断状态和interrupt()、isInterrupted()、static interrupted()方法辨析"/>

java线程的打断状态和interrupt()、isInterrupted()、static interrupted()方法辨析

在java中,阻塞的线程可以打断后继续执行,线程打断前后会有一个打断状态的变化,这个状态会影响park方法的使用,本文主要介绍java打断状态相关的内容。

1、打断阻塞的线程
线程阻塞有很多情况,比如没有获取到锁、执行sleep、执行join等,下面以sleep为例:

Thread t1 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {System.out.println("02-------线程t1被打断");e.printStackTrace();}System.out.println("03--t1的打断状态-:"+Thread.currentThread().isInterrupted());//开始循环,直到线程被打断后,打断标记变为true才停止for (;;){if (Thread.currentThread().isInterrupted())break;}System.out.println("04-------t1的打断状态-:"+Thread.currentThread().isInterrupted());System.out.println("05--t1的打断状态-:"+Thread.interrupted());//继续瞓5stry {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("06----Thread.interrupted()过后---t1的打断状态-:"+Thread.currentThread().isInterrupted());System.out.println("07-------t1 over");}, "t1");//启动线程t1t1.start();TimeUnit.SECONDS.sleep(2);System.out.println("01--t1的打断状态-:"+t1.isInterrupted());//打断sleep阻塞状态的线程t1.interrupt();TimeUnit.SECONDS.sleep(2);//打断非阻塞状态的线程t1.interrupt();
//输出
01--t1的打断状态-:false
02-------线程t1被打断
03--t1的打断状态-:false
java.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:340)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at com.iwat.arithmetic.leetcode.Q452.lambda$main$0(Q452.java:44)at java.lang.Thread.run(Thread.java:748)
04-------t1的打断状态-:true
05--t1的打断状态-:true
06----Thread.interrupted()过后---t1的打断状态-:false
07-------t1 over

方法介绍:

  • interrupt():打断某一线程,

    • 如果线程阻塞==(sleep、join、await没有结束,任务调度器不会考虑阻塞的线程)==,会抛出异常。并且将线程的阻塞标记改为false,然后继续运行。注意:锁的作用时阻塞进程,阻塞进程有很多种方式,无论什么原因造成的阻塞,任务调度器都不会考虑阻塞的线程
    • 如果线程正常运行,会将线程的阻塞标记改为ture,然后继续运行。
  • isInterrupted():返回当前线程的打断标记

  • static interrupted():返回当前线程的打断标记,同时将打断标记改为false(只能在线程内部执行),方法如下:

public static boolean interrupted() {return currentThread().isInterrupted(true);
}

线程的打断状态变化:

  • 默认时false
  • 阻塞被打断仍是false
  • 非阻塞状态执行interrupt(),阻塞状态变为true
  • 执行static interrupted(),阻塞状态变为false

2、park方法的使用
LockSupport.park()会阻塞线程,生效的条件时阻塞状态为false,当阻塞状态为true时,方法无效无法阻塞线程。

Thread t1 = new Thread(()->{log.info("01------parking...");LockSupport.park();log.info("02------unpark");log.info("03------t1的打断状态"+Thread.currentThread().isInterrupted());//如果打断标记已经是 true, 则 park 会失效LockSupport.park();log.info("04-------unpark");},"t1");t1.start();TimeUnit.SECONDS.sleep(3);log.info("t1的打断状态"+t1.isInterrupted());//打断parkt1.interrupt();
//输出
2023-03-04 08:36:46.518 [t1] INFO -- 01------parking...
2023-03-04 08:36:49.522 [main] INFO -- t1的打断状态false
2023-03-04 08:36:49.522 [t1] INFO -- 02------unpark
2023-03-04 08:36:49.522 [t1] INFO -- 03------t1的打断状态true
2023-03-04 08:36:49.523 [t1] INFO -- 04-------unpark

从打印时间可以看到第二个park没有生效。

更多推荐

java线程的打断状态和interrupt()、isInterrupted()、static interrupted()方法辨析

本文发布于:2024-02-13 09:54:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1758215.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程   状态   方法   java   interrupt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!