`

中断线程的方法

    博客分类:
  • Java
阅读更多

Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!

  现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:

  1,线程正常执行完毕,正常结束。

  也就是让run方法执行完毕,该线程就会正常结束。

  2,监视某些条件,结束线程的不间断运行。

  然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。

  通常,它们执行在一个while(true)的死循环中。

  如:

  @Override

  publicvoid run() {

      while(true){

          someWork();

          if(finished){

              break;

          }

          try {

              Thread.sleep(10000);

          } catch (InterruptedException e) {

              /* TODO自动生成 catch 块

              *

              */

              e.printStackTrace();

          }

      }

  }

  我们可以在while死循环内,每次循环时,察看外部条件,看看是否需要关闭当前线程。如果是,就break,跳出死循环,或者是抛出异常,跳出死循环,结束线程。

  3,捕获InterruptedException 运行时异常,中断当前线程。

  有些执行伺服任务的线程,在while(true)这样的死循环内部,是一个阻塞中的方法。此时,就不能采用第二种方法了。因为,当该方法没有返回时,该线程一直处于阻塞当中,根本无法执行其他语句。

  此时,就需要调用该线程的interrupt方法,产生一个InterruptedException运行时异常,是阻塞中的那个方法抛出这个异常,从而让我们有机会结束这个线程的执行。

  如:

  @Override

  publicvoid run() {

      while(true){

          try {

              // getSendMessages 是BlockingQueue类。它的take方法将会阻塞!

              responseMessage = this.getSendMessages().take();

          } catch (InterruptedException e1) {

              thrownew RuntimeException();

              //或者break;

          }

          someWork();

    }

    }

  一个外部的Thread 对象 指向这个线程。 需要结束这个线程时,只需要调用thread对象的interrupt() 方法,就会在

  responseMessage = this.getSendMessages().take();

  这条语句中产生一个InterruptedException异常,从而结束该线程的阻塞状态,通过抛出异常,或者break跳出死循环,结束这个线程。

分享到:
评论

相关推荐

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

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

    linux的中断线程化实现[借鉴].pdf

    在Linux操作系统中,中断线程化是一种将中断处理与用户空间任务解耦合的技术,它允许中断处理程序在后台执行,从而改善系统响应时间和资源管理。2.6.25.8内核版本引入了这一特性,使得中断处理更加灵活且高效。 ...

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

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

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

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

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

    本示例将详细探讨Java中断线程的正确方法,以确保线程安全且高效地退出。 首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行...

    CPU中断——实现多线程机制

    ### CPU中断——实现多线程机制 #### 一、引言 在计算机系统中,多线程机制是一种常见的技术手段,用于提高程序的执行效率和响应能力。它允许在一个进程中同时运行多个线程,每个线程都可以独立地执行任务。为了...

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

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

    线程及方法调用

    在Java中,推荐使用`interrupt()`方法来请求线程中断,然后在线程的`run()`方法中检查`isInterrupted()`或`interrupted()`状态来决定是否退出循环。例如: ```java public class MyRunnable implements Runnable { ...

    Java中实现线程的超时中断方法实例

    1. 使用 Thread.interrupt() 方法设置线程的中断标志,但是这并不能真正中断线程,而是通知线程可以被中断。 2. 使用 ScheduledThreadPoolExecutor 来延迟执行任务,任务中执行线程的 interrupt() 方法。 使用 ...

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本概念。栈是一种后进先出(LIFO, Last In First Out)的数据结构,它允许数据被存储和检索,但只允许在一段称为...

    Android中断线程的处理方法

    中断线程的处理是确保应用响应性和用户体验的关键。本篇将详细讲解如何在Android中正确地中断线程,以及处理中断后的工作。 首先,Android中的线程中断主要是通过`Thread.interrupted()`或`Thread.currentThread()....

    Java中断线程的方法

    在Java多线程编程中,正确地中断线程是非常重要的,因为不安全的中断操作可能导致数据不一致、资源泄露等问题。传统的线程中断方法,如`Thread.stop()`, `Thread.suspend()`, `Thread.resume()`以及`Runtime....

    设计滚动字演示线程状态及改变方法

    - **interrupt()**:中断线程,标记线程的中断状态。 - **isInterrupted()和interrupted()**:检查线程是否被中断,前者是非静态方法,后者是静态方法。 4. **线程同步和通信**: - **synchronized**:用于控制...

    线程方法操作

    9. **中断线程** 通过`interrupt()`方法可以中断一个线程,但需要注意,这并不会立即停止线程,而是设置一个中断标志,线程需要检查这个标志并决定如何响应。 10. **守护线程** 守护线程(Daemon Thread)是一种...

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

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

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

    在这5秒后,我们调用`interrupt()`方法来设置线程的中断标志,表示希望线程停止工作。一旦`PrimeGenerator`线程的`isInterrupted()`方法检测到中断标志,它就会终止循环并打印相应的信息。 通过这个例子,我们可以...

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

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

    java 多线程同步方法的实例

    ReentrantLock支持公平锁和非公平锁,可以显式地获取和释放锁,还提供了tryLock()方法尝试获取锁,以及lockInterruptibly()方法使线程在等待锁时能响应中断。 现在,我们来看一个具体的实例——银行账户转账操作,...

    JAVA线程停止的方法

    2. **中断线程(Interrupt)** 3. **使用`ExecutorService`和`Future`** 其中,使用标志变量是最常见也最安全的方式之一,它允许线程自然退出其执行循环,避免了突然终止带来的副作用。 ### 使用标志变量停止线程 ...

Global site tag (gtag.js) - Google Analytics