SelectorManager包含Reactor(extends Thread)数组,要停止SelectorManager所以要先停掉各个Reactor,查看代码如下:
public synchronized void stop() {
if (!started) {
return;
}
started = false;
for (Reactor reactor : reactorSet) {
reactor.interrupt();
}}
为什么要使用reactor.interrupt()呢?查看Reactor.run()如下代码:
public void run() {
selectorManager.notifyReady();
while (selectorManager.isStarted() && selector.isOpen()) {
try {
int selected = selector.select(wait);
if (selected == 0) {
if (before != -1) {
lookJVMBug(before, selected, wait);
}
关键代码是如下几句:
##
while (selectorManager.isStarted() && selector.isOpen()) {
try {
int selected = selector.select(wait);
##
由于之前在SelectorManager.stop中已经设置started = false,所以在下次循环时Reactor会run结束,但如果该线程正在阻塞执行selector.select(wait),则要等待wait秒才能够返回,如果wait值很大则此线程(Reactor)需要等待很长时间后才能够停止。有没有办法让线程立即响应并退出呢?
我们查看Selector.select文档发现如下:
* <p> This method performs a blocking <a href="#selop">selection
* operation</a>. It returns only after at least one channel is selected,
* this selector's {@link #wakeup wakeup} method is invoked, the current
* thread is interrupted, or the given timeout period expires, whichever
* comes first.
也就是说其实Selector.select方法是响应线程中断的,所以“reactor.interrupt();”后,Reactor线程执行“selector.select(wait);”时会立即返回的。
总结:在某些情况下,必须通过中断(Thread.interrupt())使阻塞的线程中断并返回正常逻辑。如下所示:
if (!started) {
return;
}
started = false;
for (Reactor reactor : reactorSet) {
reactor.interrupt();
}}
为什么要使用reactor.interrupt()呢?查看Reactor.run()如下代码:
public void run() {
selectorManager.notifyReady();
while (selectorManager.isStarted() && selector.isOpen()) {
try {
int selected = selector.select(wait);
if (selected == 0) {
if (before != -1) {
lookJVMBug(before, selected, wait);
}
关键代码是如下几句:
##
while (selectorManager.isStarted() && selector.isOpen()) {
try {
int selected = selector.select(wait);
##
由于之前在SelectorManager.stop中已经设置started = false,所以在下次循环时Reactor会run结束,但如果该线程正在阻塞执行selector.select(wait),则要等待wait秒才能够返回,如果wait值很大则此线程(Reactor)需要等待很长时间后才能够停止。有没有办法让线程立即响应并退出呢?
我们查看Selector.select文档发现如下:
* <p> This method performs a blocking <a href="#selop">selection
* operation</a>. It returns only after at least one channel is selected,
* this selector's {@link #wakeup wakeup} method is invoked, the current
* thread is interrupted, or the given timeout period expires, whichever
* comes first.
也就是说其实Selector.select方法是响应线程中断的,所以“reactor.interrupt();”后,Reactor线程执行“selector.select(wait);”时会立即返回的。
总结:在某些情况下,必须通过中断(Thread.interrupt())使阻塞的线程中断并返回正常逻辑。如下所示:
class SessionMonitor extends Thread {
public SessionMonitor() {
this.setName("Heal-Session-Thread");
}
@Override
public void run() {
while (MemcachedConnector.this.isStarted() && MemcachedConnector.this.enableHealSession) {
ReconnectRequest request = null;
try {
request = MemcachedConnector.this.waitingQueue.take();
。。。。。。
} catch (InterruptedException e) {
// ignore,check status
} catch (Exception e) {
log.error("SessionMonitor connect error", e);
this.rescheduleConnectRequest(request);
}
此代码通过MemcachedConnector.this.isStarted()判断是否结束线程。但程序逻辑可能会阻塞在request = MemcachedConnector.this.waitingQueue.take();无法返回。所以需要通过中断线程(this.sessionMonitor.interrupt();)让waitingQueue.take()中断并抛出异常,run()截获异常不做任何处理,使逻辑流转到MemcachedConnector.this.isStarted()判断失败并退出线程。
public SessionMonitor() {
this.setName("Heal-Session-Thread");
}
@Override
public void run() {
while (MemcachedConnector.this.isStarted() && MemcachedConnector.this.enableHealSession) {
ReconnectRequest request = null;
try {
request = MemcachedConnector.this.waitingQueue.take();
。。。。。。
} catch (InterruptedException e) {
// ignore,check status
} catch (Exception e) {
log.error("SessionMonitor connect error", e);
this.rescheduleConnectRequest(request);
}
此代码通过MemcachedConnector.this.isStarted()判断是否结束线程。但程序逻辑可能会阻塞在request = MemcachedConnector.this.waitingQueue.take();无法返回。所以需要通过中断线程(this.sessionMonitor.interrupt();)让waitingQueue.take()中断并抛出异常,run()截获异常不做任何处理,使逻辑流转到MemcachedConnector.this.isStarted()判断失败并退出线程。
##
代码详见:com.google.code.yanf4j.nio.impl包
##
代码详见:com.google.code.yanf4j.nio.impl包
##
相关推荐
Java的线程提供了中断机制,通过`Thread.interrupt()`和`Thread.isInterrupted()`方法来控制和检查线程中断状态。在长时间运行的任务中,应定期检查中断标志,一旦检测到中断,及时清理资源并退出。 ```java ...
书中还可能涉及异常处理和线程中断,`interrupt()`方法用于标记线程中断状态,`isInterrupted()`和`InterruptedException`用于检查和处理中断。中断机制是Java中优雅停止线程的关键。 另外,Java并发工具库(java....
Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...
5. 在请求退出熔断器时,恢复请求线程的中断标识。 注意: * 使用 Thread.interrupt() 方法不能真正中断线程,只是设置中断标志。 * 使用 ScheduledThreadPoolExecutor 可以实现延迟执行任务,但是需要注意性能...
9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...
9. **线程中断**:通过`interrupt()`方法设置线程的中断标志,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求。 10. **线程Local变量**:`ThreadLocal`类为每个线程提供独立的变量副本,...
Java线程是多任务编程的...深入学习Java线程,不仅需要理解以上基本概念,还要熟悉线程池的使用、死锁和活锁的预防、线程中断机制、线程安全类库如Concurrent包等。通过实际项目中的实践,才能更好地掌握Java线程编程。
《Java线程》这本书是Java开发人员深入理解并发编程的重要参考资料。Java作为一种广泛使用的编程语言,其并发处理能力是高效程序设计的关键。本电子书详细介绍了如何在Java环境中有效地使用多线程,优化程序性能,并...
1. **线程中断与停止**:Java中,我们通常使用`Thread.interrupt()`来请求线程停止,但这并不保证线程会立即停止。线程需要在适当的位置检查中断状态,并响应中断。例如,通过`Thread.currentThread().isInterrupted...
Java线程有10个优先级,`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10),默认优先级为`Thread.NORM_PRIORITY`(5)。但实际执行顺序并不完全取决于优先级,因为线程调度器的行为取决于操作系统。 6. **线程池...
守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,程序会终止,即使还有守护线程在运行。 掌握Java的多线程机制对于编写高效、并发友好的应用程序至关重要,它...
1. **不要直接调用Thread对象的stop()方法**:这个方法已经被弃用,因为它可能引发不安全的线程中断,导致数据损坏。当一个线程正在执行系统资源密集型操作时,突然停止可能会留下资源泄露和不一致的状态。 2. **...
2. 守护线程与用户线程:守护线程不阻碍JVM退出,而用户线程则会阻止JVM退出。 八、中断与异常处理 1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. ...
Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...
首先,我们需要了解Java中的线程中断机制。线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程...
Java多线程编程安全退出线程方法介绍 Java多线程编程安全退出线程方法的重要性在于确保线程的资源正确释放,避免程序工作在不确定的状态下。以下是Java多线程编程安全退出线程方法的知识点: 1. Thread.stop()方法...
Java提供了一个更安全的中断线程的机制,即`Thread.interrupt()`。当调用`interrupt()`时,目标线程的中断状态会被设置,线程在检查到中断状态后可以决定如何响应。例如,`Thread.sleep()`、`SocketInputStream....
Java通过`Thread.interrupt()`方法提供线程中断机制。当调用一个线程的`interrupt()`方法时,并不会立即停止该线程,而是设置线程的中断状态。线程需要通过检查`InterruptedException`异常来响应中断。例如,当线程...
本文将深入探讨Java线程停止的方法,特别是通过一个示例代码片段来解析如何利用标志变量(Flag)控制线程的生命周期,以及这种方法背后的原理与最佳实践。 ### Java线程停止方法概述 在Java中,直接调用线程的`...
Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...