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多线程Client/Server程序
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解
线程开启,暂停,恢复,退出操作简易实现demo
Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程
Java线程Java线程Java线程Java线程Java线程Java线程
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...
java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
易语言正确退出线程源码,正确退出线程,多线程,正常结束线程,提示信息,发送消息
Java线程模块Java线程之秒表新手学习Java线程模块时,利用Java中设置线程的暂停间隔,做的简易秒表
java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
java线程同步java线程同步java线程同步
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...
java线程.pdf java 学习java
Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet
java 线程 新手java 线程 新手java 线程 新手java 线程 新手
分析java线程日志的工具,使用jstack把java线程日志dump下来,然后上传到该工具,就可以查看线程阻塞情况等信息。
基于server/socket编写的,能实现多人群聊和单人私聊。