`

java5中使用interrupt()来停止java线程的方法(转)

阅读更多

在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在Java5的java.util.concurrent中使用interrupt(),让线程在run方法中停止。

简介
在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。

在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中详细讲解了舍弃这些方法的原因。那么,我们究竟应该如何停止线程呢?

建议使用的方法
在《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中,建议使用如下的方法来停止线程:

 Code [http://www.xueit.com]
    private volatile Thread blinker;
    public void stop() {
        blinker = null;
    }
    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }
关于使用volatile关键字的原因,请查看http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#36930

当线程处于非运行(Run)状态
当线程处于下面的状况时,属于非运行状态:

当sleep方法被调用。

当wait方法被调用。

当被I/O阻塞,可能是文件或者网络等等。

当线程处于上述的状态时,使用前面介绍的方法就不可用了。这个时候,我们可以使用interrupt()来打破阻塞的情况,如:

 Code [http://www.xueit.com]
public void stop() {
        Thread tmpBlinker = blinker;
        blinker = null;
        if (tmpBlinker != null) {
           tmpBlinker.interrupt();
        }
    }

当interrupt()被调用的时候,InterruptedException将被抛出,所以你可以再run方法中捕获这个异常,让线程安全退出:

 Code [http://www.xueit.com]
try {
   ....
   wait();
} catch (InterruptedException iex) {
   throw new RuntimeException("Interrupted",iex);
}

分享到:
评论

相关推荐

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

    在 run 方法中,我们使用 isInterrupted 方法来检查当前线程的中断状态标志。如果该标志位已经被设置,我们将退出循环。 在 catch 语句中,我们捕捉 InterruptedException 异常,并重新设置中断状态标志,以便在...

    JAVA线程停止的方法

    ### Java线程停止方法概述 在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. *...

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

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

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    在Java中,线程的协同主要通过`wait()`和`notify()`或`notifyAll()`方法来实现,这些方法定义在`Object`类中。当一个线程调用`wait()`时,它会释放当前持有的锁并进入等待状态,直到其他线程调用`notify()`或`...

    java多线程Demo

    当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并调用`start()`方法启动线程。例如: ```java class MyThread extends Thread { public void ...

    java线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件...在实际开发中,建议优先考虑使用`interrupt`方法来管理线程的中断。

    线程关闭javacv关闭20190508.rar

    Java提供了interrupt()方法来请求线程停止,但是这并不保证线程会立即停止,线程可能还需要完成一些清理工作。因此,线程应该定期检查是否被中断,并在适当的时候终止自己的运行。此外,确保释放所有打开的资源,如...

    Java多线程机制(讲述java里面与多线程有关的函数)

    9.7 在同步方法中使用wait(), notify和notifyAll(): 这些方法用于线程间通信。wait()使当前线程进入等待状态,直到收到其他线程的唤醒信号;notify()唤醒一个等待的线程,notifyAll()唤醒所有等待的线程。 9.8 挂...

    java线程强制停止的两个Demo

    Java提供了多种方法来尝试停止线程,但需要注意的是,直接中断线程可能会导致数据不一致和资源泄漏等问题,因此应当谨慎使用。下面我们将详细讨论Java中两种常见的线程强制停止的方法,并通过`AlternateStop.java`和...

    java 多线程并发实例

    1. 继承Thread类:通过创建新的Thread子类并重写其run()方法,然后创建该子类的实例并调用start()方法来启动线程。这种方式使得线程拥有自己的特定逻辑。 2. 实现Runnable接口:创建一个实现了Runnable接口的类,并...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    java中线程的应用例子

    3. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,但它们必须在`synchronized`代码块中使用,否则会抛出异常。 4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和...

    Java线程.ppt

    `start()`方法启动线程,`sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断...

    Java多线程笔记

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

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

    Java没有提供直接的`Thread.stop()`方法来安全地停止线程,而是建议通过共享变量或者中断机制来让线程自行决定何时结束。例如,设置一个布尔标志,线程在检查这个标志时发现需要结束,然后自行退出。 5. **示例代码...

    java中 如何终止一个线程

    在Java早期版本中,提供了`Thread.stop()`方法来直接终止线程,但这种方法存在严重的安全问题。例如,它可能会导致对象处于不稳定的状态,或者在对象的某些关键操作(如资源释放)完成之前就强行终止线程,从而引发...

    JAVA线程学习(源代码)

    Java提供了多种方法来控制线程状态,如`start()`启动线程,`sleep()`使线程暂停,`join()`等待线程完成,以及`interrupt()`中断线程。 并发控制是线程编程中的重要部分。Java提供了synchronized关键字来实现互斥...

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

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法...在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)

    Java线程超时监控

    总之,Java提供了多种方法来监控和管理线程的超时,包括使用`Future`、`ExecutorService`和`Thread.join`。正确地使用这些工具可以提高程序的健壮性,防止因长时间运行任务而导致的性能问题。在实际开发中,应根据...

Global site tag (gtag.js) - Google Analytics