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跳出死循环,结束这个线程。
分享到:
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Linux操作系统中,中断线程化是一种将中断处理与用户空间任务解耦合的技术,它允许中断处理程序在后台执行,从而改善系统响应时间和资源管理。2.6.25.8内核版本引入了这一特性,使得中断处理更加灵活且高效。 ...
C++11关于thead的应用,利用std::condition std::mutex提供如何中断,停止和继续功能,
在Java编程中,中断线程是一项重要的任务,它允许程序在必要的时候停止或者结束一个正在运行的线程。本教程的压缩包包含了中断线程的源代码实例和详细指导,旨在帮助开发者深入理解和掌握这一核心概念。以下是关于...
本示例将详细探讨Java中断线程的正确方法,以确保线程安全且高效地退出。 首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行...
### CPU中断——实现多线程机制 #### 一、引言 在计算机系统中,多线程机制是一种常见的技术手段,用于提高程序的执行效率和响应能力。它允许在一个进程中同时运行多个线程,每个线程都可以独立地执行任务。为了...
以下是对Java中断线程的详细解释: 1. **线程终止条件**: - 当`run`方法执行完毕。 - `return`语句执行,提前结束`run`方法。 - 出现未捕获的异常,导致`run`方法终止。 2. **`stop`方法的弃用**: Java早期...
在Java中,推荐使用`interrupt()`方法来请求线程中断,然后在线程的`run()`方法中检查`isInterrupted()`或`interrupted()`状态来决定是否退出循环。例如: ```java public class MyRunnable implements Runnable { ...
1. 使用 Thread.interrupt() 方法设置线程的中断标志,但是这并不能真正中断线程,而是通知线程可以被中断。 2. 使用 ScheduledThreadPoolExecutor 来延迟执行任务,任务中执行线程的 interrupt() 方法。 使用 ...
在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本概念。栈是一种后进先出(LIFO, Last In First Out)的数据结构,它允许数据被存储和检索,但只允许在一段称为...
中断线程的处理是确保应用响应性和用户体验的关键。本篇将详细讲解如何在Android中正确地中断线程,以及处理中断后的工作。 首先,Android中的线程中断主要是通过`Thread.interrupted()`或`Thread.currentThread()....
在Java多线程编程中,正确地中断线程是非常重要的,因为不安全的中断操作可能导致数据不一致、资源泄露等问题。传统的线程中断方法,如`Thread.stop()`, `Thread.suspend()`, `Thread.resume()`以及`Runtime....
- **interrupt()**:中断线程,标记线程的中断状态。 - **isInterrupted()和interrupted()**:检查线程是否被中断,前者是非静态方法,后者是静态方法。 4. **线程同步和通信**: - **synchronized**:用于控制...
9. **中断线程** 通过`interrupt()`方法可以中断一个线程,但需要注意,这并不会立即停止线程,而是设置一个中断标志,线程需要检查这个标志并决定如何响应。 10. **守护线程** 守护线程(Daemon Thread)是一种...
`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...
在这5秒后,我们调用`interrupt()`方法来设置线程的中断标志,表示希望线程停止工作。一旦`PrimeGenerator`线程的`isInterrupted()`方法检测到中断标志,它就会终止循环并打印相应的信息。 通过这个例子,我们可以...
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
ReentrantLock支持公平锁和非公平锁,可以显式地获取和释放锁,还提供了tryLock()方法尝试获取锁,以及lockInterruptibly()方法使线程在等待锁时能响应中断。 现在,我们来看一个具体的实例——银行账户转账操作,...
2. **中断线程(Interrupt)** 3. **使用`ExecutorService`和`Future`** 其中,使用标志变量是最常见也最安全的方式之一,它允许线程自然退出其执行循环,避免了突然终止带来的副作用。 ### 使用标志变量停止线程 ...