在开发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);
}
分享到:
相关推荐
在 run 方法中,我们使用 isInterrupted 方法来检查当前线程的中断状态标志。如果该标志位已经被设置,我们将退出循环。 在 catch 语句中,我们捕捉 InterruptedException 异常,并重新设置中断状态标志,以便在...
### Java线程停止方法概述 在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. *...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Java中,线程的协同主要通过`wait()`和`notify()`或`notifyAll()`方法来实现,这些方法定义在`Object`类中。当一个线程调用`wait()`时,它会释放当前持有的锁并进入等待状态,直到其他线程调用`notify()`或`...
当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并调用`start()`方法启动线程。例如: ```java class MyThread extends Thread { public void ...
### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件...在实际开发中,建议优先考虑使用`interrupt`方法来管理线程的中断。
Java提供了interrupt()方法来请求线程停止,但是这并不保证线程会立即停止,线程可能还需要完成一些清理工作。因此,线程应该定期检查是否被中断,并在适当的时候终止自己的运行。此外,确保释放所有打开的资源,如...
9.7 在同步方法中使用wait(), notify和notifyAll(): 这些方法用于线程间通信。wait()使当前线程进入等待状态,直到收到其他线程的唤醒信号;notify()唤醒一个等待的线程,notifyAll()唤醒所有等待的线程。 9.8 挂...
Java提供了多种方法来尝试停止线程,但需要注意的是,直接中断线程可能会导致数据不一致和资源泄漏等问题,因此应当谨慎使用。下面我们将详细讨论Java中两种常见的线程强制停止的方法,并通过`AlternateStop.java`和...
1. 继承Thread类:通过创建新的Thread子类并重写其run()方法,然后创建该子类的实例并调用start()方法来启动线程。这种方式使得线程拥有自己的特定逻辑。 2. 实现Runnable接口:创建一个实现了Runnable接口的类,并...
9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...
3. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,但它们必须在`synchronized`代码块中使用,否则会抛出异常。 4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和...
`start()`方法启动线程,`sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断...
在 Java 中,线程中断是通过 interrupt 方法来实现的,该方法只是给线程置一个中断标志位,并不会立即停止线程的运行。interrupted 方法可以判断是否被中断,静态方法 interrupted() 则可以判断是否被中断,并清除...
Java没有提供直接的`Thread.stop()`方法来安全地停止线程,而是建议通过共享变量或者中断机制来让线程自行决定何时结束。例如,设置一个布尔标志,线程在检查这个标志时发现需要结束,然后自行退出。 5. **示例代码...
在Java早期版本中,提供了`Thread.stop()`方法来直接终止线程,但这种方法存在严重的安全问题。例如,它可能会导致对象处于不稳定的状态,或者在对象的某些关键操作(如资源释放)完成之前就强行终止线程,从而引发...
Java提供了多种方法来控制线程状态,如`start()`启动线程,`sleep()`使线程暂停,`join()`等待线程完成,以及`interrupt()`中断线程。 并发控制是线程编程中的重要部分。Java提供了synchronized关键字来实现互斥...
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法...在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)
总之,Java提供了多种方法来监控和管理线程的超时,包括使用`Future`、`ExecutorService`和`Thread.join`。正确地使用这些工具可以提高程序的健壮性,防止因长时间运行任务而导致的性能问题。在实际开发中,应根据...