`
zyx322
  • 浏览: 4304 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

中断线程Interrupt与Interrupted的用处

    博客分类:
  • Java
 
阅读更多

★ 线程状态

       Java虚拟机将线程运行过程分成四种状态 。 (1) New 新生;(2) Runnable 可运行;(3) Blocked 阻塞;(4) Dead 死亡。

      值得注意的是: 线程的可运行状态并不代表线程一定在运行(runnable != running ) 。 大家都知道:所有现代桌面和服务器操作系统都使用了抢占式的线程调度策略 。一旦线程开始执行,并不是总是保持持续运行状态的。当系统分给它的时间片(非常小的运行时间单位)用完以后,不管程序有没有执行完,线程被强制放弃CPU,进入就绪状态,直到下次被调度后开始继续执行。也就是说, Runnable可运行状态的线程处于两种可能的情况下:(1)占用CPU运行中,(2)等待调度的就绪状态。 这里要声明一下:处于等待调度的就绪状态线程和处于阻塞的线程是完全不同的。就绪的线程是因为时间片用完而放弃CPU,其随时都有可能再次获得CPU而运行,这一切取决于分时OS的线程调度策略。

       在很多操作系统的专业术语中,这种因时间片用完而被剥夺CPU的情况我们叫做线程中断 。注意这和我们下面要将得中断线程是两个完全不同的概念。事实上,我们不可能通过应用程序来控制CPU的线程中断,除非我们能够自由调用OS的内核。


中断线程 —— interrupt()

       一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法:
       (1) Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 这些终止线程运行的方法 。这些方法已经被废弃,使用它们是极端不安全的。
       (2) Thread.interrupt() 方法是很好的选择。但是使用的时候我们必须好好理解一下它的用处。

Java代码
  1. //无法中断正在运行的线程代码     
  2. class TestRunnable implements Runnable{     
  3.       public void run(){     
  4.             while(true)     
  5.             {     
  6.                   System.out.println( "Thread is running..." );     
  7.                   long time = System.currentTimeMillis();//去系统时间的毫秒数     
  8.             while((System.currentTimeMillis()-time < 1000)) {     
  9.                    //程序循环1秒钟,不同于sleep(1000)会阻塞进程。     
  10.             }     
  11.               }     
  12.        }     
  13. }     
  14. public class ThreadDemo{     
  15.          public static void main(String[] args){     
  16.                Runnable r=new TestRunnable();     
  17.                Thread th1=new Thread(r);     
  18.                th1.start();     
  19.                th1.interrupt();              
  20.         }     
  21. }     
  22. /运行结果:一秒钟打印一次Thread is running...。程序没有终止的任何迹象   
      上面的代码说明interrupt()并没有中断一个正在运行的线程,或者说让一个running中的线程放弃CPU。那么interrupt到底中断什么。

       首先我们看看interrupt究竟在干什么。

       当我们调用th1.interrput()的时候,线程th1的中断状态(interrupted status) 会被置位。我们可以通过Thread.currentThread().isInterrupted() 来检查这个布尔型的中断状态。

        在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 "。好好体会这句话的含义,看看下面的代码:
Java代码  
  1. //Interrupted的经典使用代码     
  2. public void run(){     
  3.         try{     
  4.              ....     
  5.              while(!Thread.currentThread().isInterrupted()&& more work to do){     
  6.                     // do more work;     
  7.              }     
  8.         }catch(InterruptedException e){     
  9.                     // thread was interrupted during sleep or wait     
  10.         }     
  11.         finally{     
  12.                    // cleanup, if required     
  13.         }     
  14. }    

       很显然,在上面代码中,while循环有一个决定因素就是需要不停的检查自己的中断状态。当外部线程调用该线程的interrupt 时,使得中断状态置位。这是该线程将终止循环,不在执行循环中的do more work了。

       这说明: interrupt中断的是线程的某一部分业务逻辑,前提是线程需要检查自己的中断状态(isInterrupted())。

       但是当th1被阻塞的时候,比如被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞时。调用它的interrput()方法。可想而知,没有占用CPU运行的线程是不可能给自己的中断状态置位的。这就会产生一个InterruptedException异常。

Java代码  
  1.  //中断一个被阻塞的线程代码   
  2. class TestRunnable implements Runnable{   
  3.      public void run(){   
  4.           try{   
  5.         Thread.sleep(1000000); //这个线程将被阻塞1000秒   
  6.        }catch(InterruptedException e){   
  7.          e.printStackTrace();   
  8.                      //do more work and return.   
  9.           }   
  10.      }   
  11. }   
  12. public class TestDemo2{   
  13.       public static void main(String[] args) {   
  14.             Runnable tr=new TestRunnable();   
  15.             Thread th1=new Thread(tr);   
  16.             th1.start(); //开始执行分线程   
  17.         while(true){   
  18.        th1.interrupt();  //中断这个分线程   
  19.         }   
  20.       }   
  21. }   
  22. /*运行结果:  
  23.    java.lang.InterruptedException: sleep interrupted  
  24.         at java.lang.Thread.sleep(Native Method)  
  25.         at TestRunnable.run(TestDemo2.java:4)  
  26.         at java.lang.Thread.run(Unknown Source)*/  

 

分享到:
评论

相关推荐

    java线程中的interrupt,isInterrupt,interrupted方法

    需要注意的是,interrupt 方法仅仅设置了线程的中断状态标志,并不会真正地中断线程。要中断线程,需要在 run 方法中检查中断状态标志,并根据需要退出或中断线程。 isInterrupted 方法 isInterrupted 方法用于...

    java线程中断之interrupt和stop.docx

    `interrupt`方法是一种更安全的方式,它通过改变线程的状态来中断线程,而不会直接结束线程的生命。相比之下,`stop`方法虽然可以直接终止线程,但由于其可能导致的问题,不推荐使用。在实际开发中,建议优先考虑...

    09.多线程编程基础-停止线程-使用interrupt方法中断线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    定时器中断_interrupt_STM32F103_timer_

    3. 配置中断:开启定时器的更新中断(TIMx_UpdateEvent)或其他中断,如触发中断或比较中断。 4. 开启定时器:通过使能定时器的控制寄存器来启动定时器。 中断函数是实现定时器功能的关键。当定时器达到预设的计...

    Java多线程之中断线程(Interrupt)的使用详解

    `Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...

    Java 实例 - 中断线程源代码+详细指导教程.zip

    在Java编程中,中断线程是一项重要的任务,它允许程序在必要的时候停止或者结束一个正在运行的线程。本教程的压缩包包含了中断线程的源代码实例和详细指导,旨在帮助开发者深入理解和掌握这一核心概念。以下是关于...

    java中断线程的正确姿势完整示例.rar

    在Java编程中,中断线程是一项重要的任务,特别是在多线程环境下,我们可能需要停止某个线程的执行,以优化程序资源的使用或响应特定的系统需求。本示例将详细探讨Java中断线程的正确方法,以确保线程安全且高效地...

    Thread类的interrupt(),interrupted(),isInterrupted()1

    在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...

    单片机中断系统Interrupt2022优秀文档.ppt

    "单片机中断系统Interrupt2022优秀文档.ppt" 单片机中断系统是计算机系统中的一种重要组件,其作用是使CPU能够响应外部事件或请求,并且能够快速处理这些事件或请求,从而提高计算机系统的性能和实时性。 中断系统...

    浅谈Java线程Thread之interrupt中断解析

    需要注意的是,在使用interrupt机制时,需要注意线程的中断状态位的变化,避免使用Thread.interrupted()方法来判断线程是否被中断,因为该方法调用后会将中断标示位清除,即重新设置为false。 Java线程Thread之...

    计算机中断处理机制(interrupt)

    中断处理机制是操作系统与硬件设备交互的关键技术,它使得计算机系统能高效地处理输入输出(I/O)操作,特别是当I/O设备的速度远低于CPU时。在计算机中,中断是硬件设备向CPU发送的一种信号,通知CPU有特定事件发生...

    Java基本功之中断线程的理解[参考].pdf

    以下是对Java中断线程的详细解释: 1. **线程终止条件**: - 当`run`方法执行完毕。 - `return`语句执行,提前结束`run`方法。 - 出现未捕获的异常,导致`run`方法终止。 2. **`stop`方法的弃用**: Java早期...

    JAVA多线程之中断机制stop()、interrupted()、isInterrupted()

    当外部请求中断线程时,内部的`isInterrupted()`检查会发现中断状态,从而使循环结束。这种方式允许线程在完成当前任务或清理工作后优雅地退出,而不是立即停止执行。 总结来说,Java多线程的中断机制通过`...

    MCS51 中断interrupt

    MCS51中断系统是8051单片机(MCS51系列)的核心功能之一,它允许CPU在执行主程序的同时响应外部或内部发生的事件。中断机制使得微控制器能够灵活地处理突发情况,而无需连续轮询,提高了系统的实时性和效率。以下是...

    ARM中断模式(IRQ)和快速中断模式(FIQ)区别比较

    ARM处理器中,中断是响应外部或内部事件的重要机制,其内部提供了两种不同的中断处理模式,即IRQ(Interrupt Request)模式和FIQ(Fast Interrupt Request)模式。这两种模式在处理器的响应优先级、处理流程以及资源...

    Java多线程笔记

    在 Java 中,线程中断是通过 interrupt 方法来实现的,该方法只是给线程置一个中断标志位,并不会立即停止线程的运行。interrupted 方法可以判断是否被中断,静态方法 interrupted() 则可以判断是否被中断,并清除...

    一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频

    一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...

    interrupt中断

    4. 中断服务程序:在ISR中,我们执行与中断事件相关的操作,如读取传感器数据、处理通信协议或更新硬件状态。 5. 中断退出:ISR执行完毕后,会清除中断标志,以防止重复处理相同的中断。然后,通过中断返回指令恢复...

    一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频

    一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频

Global site tag (gtag.js) - Google Analytics