`

线程中断

阅读更多
线程的中断"interrupt"

线程的"中断"不是让线程停止
java中线程的中断(interrupt)只是改变了线程的中断状态,这个中断状态改变后带来的结果,是无法确定的,
有时它更是让停止中的线程继续执行的唯一手段.不但不是让线程停止运行,反而是继续执行线程的手段.

一个线程在调用interrupt()后,自己不会抛出InterruptedException异常,
如果线程a正在执行while(条件) x ++;
你调用a.interrupt();后线程会继续正常地执行下去.
但是,它的状态是已中断的.这个状态对于正在执行wait,join,sleep的线程,却改变了线程的运行结果.
   1.对于wait中等待notify/notifyAll唤醒的线程,其实这个线程已经"暂停"执行,这时如果它的中断状态被改变,那么它就会抛出异常InterruptedException
   (注意:这里的异常由wait方法抛出而不是由线程抛出的)
    此异常表明这个线程不能再等待了,等同于唤醒
    (和notify或者notifyAll的区别是:被notify/All唤醒的线程会继续执行wait下面的语句,而在wait中被中断的线程则进入catch语句.
      一些正常的逻辑要被放到catch中来运行.)
  
   有时这是唯一手段:
      比如一个线程a在某一对象b的wait中等待唤醒,其它线程必须获取到对象b的锁才能调用b.notify()[All],
      否则无法唤醒线程a,但在任何线程中可以无条件地调用a.interrupt();来达到这个目的.
      只是唤醒后的逻辑要放在catch中
      当然同 notify/All一样,继续执行a线程的条件还是要等拿到b对象的锁.

    2.对于sleep中的线程,如果你调用了Thread.sleep(一年);现在你后悔了,想让它早些醒过来,调用interrupt()方法就是唯一手段,
    只有改变它的中断状态,让它从sleep中进入catch语句中,然后再由catch中的处理转换到正常的逻辑.
     同样,join中的线程你也可以这样处理.



    对于一般介绍多线程模式的书上,他们会这样来介绍:当一个线程被中断后,在进入wait,sleep,join方法时会抛出异常.
    这有什么意义?什么场景下使用它?

     interrupt方法让wait,join,sleep中方法的"暂停"状态中恢复过来,包含两层目的:
         一.[可以使线程继续执行],那就是在catch语句中招待醒来后的逻辑,或由catch语句转回正常的逻辑.
         二.[可以直接停止线程的运行],当然在catch中什么也不处理,或return,那么就完成
            了当前线程的使命,可以使在上面"暂停"的状态中立即真正的"停止".
           
    
    



中断线程:(这里指停止线程的运行)

  一个正在看电视的孩子,听到大人说快去睡觉去,就立即睡觉去了.这样的孩子是不乖的.
  结束一个线程,我们要分析线程的运行情况.也就是线程正在干什么.如果那个孩子什么事也没干,那就让他立即去睡觉.
  而如果那个孩子正在看电视,我们就要让它把电视关好再睡觉.

所以一个线程从运行到真正的结束,应该有三个阶段:
1.正常运行.
2.处理结束前的工作,也就是准备结束.
3.结束退出.



线程在结束前的工作应该在finally中来保证线程退出前一定执行:

try{
  正在逻辑
 }catch(){}
 finally{
  清理工作
 } 

让线程结束不能调用stop方法,只能使用interrupt方法
对于一般逻辑,只要线程状态为已经中断,我们就可以让它退出,所以这样的语句可以保证线程在中断后就能结束运行:
 while(!isInterrupted()){
  正常逻辑
 }
这样如果这个线程被调用interrupt()方法,isInterrupted()为true,就会退出运行.
但是如果线程正在执行wait,sleep,join方法,你调用interrupt()方法,
还应该增加一些逻辑,代码如下:
public void run(){
   try{
       while(!isInterrupted()){
          正常工作
       }
   }
   catch(Exception e){
      return;
   }
   finally{
      清理工作
   }
  
}



如果线程执行一般逻辑在调用innterrupt后.isInterrupted()为true,退出循环后执行清理工作后结束,
即使线程正在wait,sleep,join,也会捕获异常执行清理工作后退出.



如果捕获异常的代码为如下写法(没有返回):
catch(Exception e)
{
}


wait方法检查到isInterrupted()为true,抛出异常,而你又没有处理.而一个抛出了InterruptedException的线程的状态马上就会被置为非中断状态,
如果catch语句没有处理异常,则下一次循环中isInterrupted()为false,线程会继续执行




================================interruptException方法=============================
比如Thread.sleep(), wait(), join()。
这些方法的执行通常需要比较长的时间来完成,当代码执行到阻塞方法时,一般要等待该方法返回后
才能继续往下执行,而InterruptedException提供了一种特殊的机制提前结束阻塞方法。














 


 









分享到:
评论

相关推荐

    Java并发编程示例(三):线程中断

    Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...

    Java线程中断示例程序的代码清单.pdf

    Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...

    java线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...

    C++11 线程的中断,继续以及停止

    C++11关于thead的应用,利用std::condition std::mutex提供如何中断,停止和继续功能,

    Java多线程中断机制三种方法及示例

    "Java多线程中断机制三种方法及示例" Java多线程中断机制是Java编程语言中一个重要的概念,涉及到线程的生命周期和线程的协作机制。中断机制是一种协作机制,通过中断并不能直接终止另一个线程,而需要被中断的线程...

    Java-并发-Java线程中断与停止线程详解

    线程中断   Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了...

    Java并发编程示例(四):可控的线程中断

    在Java并发编程中,线程中断是一个重要的概念,它允许我们优雅地停止正在运行的线程,而不是简单地杀死它们。在"Java并发编程示例(四):可控的线程中断"中,我们将深入理解如何利用`InterruptedException`来更好地...

    java多线程中断代码详解

    Java 多线程中断代码详解 Java 中断机制是多线程编程中的一种重要机制。它允许一个线程请求另一个线程停止执行某个操作或退出线程。Java 提供了多种方式来中断线程,包括使用 stop() 方法、interrupt() 方法和使用 ...

    详解Java线程中断知识点

    Java线程中断是多线程编程中一个关键的概念,它允许一个线程在运行时被其他线程“通知”停止其当前活动。线程中断不是立即终止线程,而是发送一个中断信号,由目标线程自己决定如何响应这个信号。在Java中,线程中断...

    浅析java线程中断的办法

    在Java中,线程中断是一种重要的协作机制,用于控制线程的停止。线程中断并不会真正强制线程停止,而是通过一种协作的方式使得线程能够适时地停下来。Java提供了中断线程的机制,但并不提供直接停止线程的方法,因为...

    AYSP#book-3#线程中断1

    } catch (InterruptedException e) {//处理完中断异常后,返回到run()方法入口//如果没有return,线程不会实际被中断,

    Java多线程 中断机制及实例详解

    Java多线程中断机制及实例详解 Java多线程中断机制是Java语言中的一种机制,用于控制线程的执行和中断。在Java中,线程可以通过interrupt()方法来中断其他线程的执行,而被中断的线程可以通过isInterrupted()方法来...

    Java检测线程中断状态的方法示例

    线程中断是控制线程执行流程的一种机制,它允许我们优雅地停止线程的执行,特别是在需要中断长时间运行或者阻塞操作时。本文将深入探讨如何检测Java线程的中断状态,并通过示例代码进行解释。 首先,Java提供了两种...

    深入Java线程中断的本质与编程原则的概述

    在Java编程中,线程中断是一项关键的并发控制机制,用于在多线程环境中优雅地终止或改变线程的行为。本文将深入探讨Java线程中断的本质以及编程原则。 首先,理解线程中断的本质。Java线程中断并不意味着强制停止一...

    Android中断并重启一个Thread线程的简单方法

    线程中断是通过`Thread.interrupt()`方法来实现的,这个方法会设置当前线程的中断标志。但是,这并不会立即停止线程的执行,而是在线程运行过程中,如果检测到中断标志被设置,通常是在循环或者阻塞操作中,会抛出`...

    JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止

    Java通过`Thread.interrupt()`方法提供线程中断机制。当调用一个线程的`interrupt()`方法时,并不会立即停止该线程,而是设置线程的中断状态。线程需要通过检查`InterruptedException`异常来响应中断。例如,当线程...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    动力节点_Java基础视频教程215_线程-线程中断

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

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

    线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程应该尽快结束。线程需要定期检查中断状态,并...

Global site tag (gtag.js) - Google Analytics