java 线程interrupt,java线程interrupted

  java 线程interrupt,java线程interrupted

  00-1010前言示例注释Object#wait和Thread.sleep的区别概括在哪里?

  00-1010本文主要讨论三种常用的中断:的方法

  中断().在一个线程中调用现成的interrupt()方法将向线程发出信号,并将中断状态标记为trueisInterrupted()。判断当前线程的中断状态。中断().恢复线程的中断状态。有三种主要的封锁方法:

  对象#等待.放弃锁,等待重新获取锁线程#join。[协作]等待线程完成执行线程#sleep。静态方法,线程休眠放弃CPU时间片==注意:interrupt()不能中断一个正在运行的线程,它只能改变中断状态。实际做的是让被阻塞的线程脱离阻塞状态。==具体来说,当被三种方法中的一种阻塞时,调用线程的interrupt()方法,那么线程就会抛出一个又一个InterruptedException,从而提前结束阻塞状态。

  00-1010公共类runner 3实现runnable { @ override public void run(){ while(true){ if(thread . current thread()。is interrupted()){ system . out . println(我被打断了,但我还在运行);} else {System.out.println(我没有输入中断);} } }公共静态void main(String[]args){ runner 3 runner 3=new runner 3();Thread thread3=新线程(runner 3);thread 3 . start();试试{ thread . sleep(2000);} catch(interrupted exception e){ e . printstacktrace();} thread3.interrupt()。}}输出结果大致如下:

  我没有被打断,我被打断了,但是我还在跑。我被打断了,但我还在跑。我被打断了,但我还在跑。

  这里我们可以看到,在执行了interrupt()之后,中断之后线程仍然在执行,线程仍然在运行。

  让我们调整跑步方法

  public run(){ while(true){ if(thread . current thread()。is interrupted()){ system . out . println(我被打断了,但我还在运行);thread . interrupted();//重置状态} else {System.out.println(我没有进入中断);}}}输出结果如下:

  我不在休息,我在休息,但我仍在奔跑,我不在休息,我不在休息.

  这里我们看到中断状态被复位,那么我们如何应用这个中断状态呢?

  00-1010当线程A执行到wait(),sleep(),join(),抛出InterruptedException后,中断状态已经被系统复位。线程A调用Thread.interrupted()并返回false。如果一个线程被调用interrupt(),而这个线程此时没有被阻塞,那么下次执行wait()、sleep()和join()时,也会抛出InterruptedException。当然,线程的中断状态在抛出后会被系统复位。1起案件

  Public Runner 3实现Runnable { @ override public void run(){ while(true){ if(thread . current thread()。is interrupted()){ system . out . println(我被打断了,但我还在运行);//试试{ thread . sleep(5000);} catch(interrupted exception e){ e . printstacktrace();system . out . println( 2 thread . current thread()。is interrupted());//output false } } else { system . out . println(我没有输入中断);} } }公共静态void main(String[]args){ runner 3 runner 3=new runner 3();Thread thread3=新线程(runner 3);thread 3 . start();试试{ thread . sleep(2000);} catch(interrupted exception e){ e . printstacktrace();} thread3.interrupt()。}}执行上面的代码后,我们可以看到异常抛出后,thread.currentthread()的输出。isinterrupted()为false,证明线程的中断状态已经复位。另外,我们先执行了interrupt(),然后进入睡眠状态,但还是抛出了异常。

  00-1010因为Object#wait方法会阻塞线程,所以当我们执行interrupt时,会抛出InterruptedException。那么Object#wait方法阻塞线程造成的区别是什么呢?==主要区别是sleep方法不释放锁,wait方法释放锁,这样其他线程就可以使用同步控制块或方法。==

  00-1010调用中断方法会改变中断状态,但不会影响线程的运行状态。当执行中断方法改变中断状态时,如果线程执行Object#wait,Thread#sleep,Thread#join,就会抛出InterruptedException,然后重置中断状态。当执行中断方法来改变中断状态时,线程不会被阻塞,将执行Object#wait。当Thread#sleep和Thread#join阻塞一个线程时,它们都会抛出InterruptedException并重置中断状态。以上就是本文关于Java线程中断的常用方法。有关Java线程中断的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

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

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