JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
来源:互联网 发布:算法设计与分析第五章 编辑:程序博客网 时间:2024/06/05 07:14
使用NIO进行SOCKET通信,服务端核心代码如下
@Override public void receiveData()throws IOException{ // TODO Auto-generated method stub recThread = new RecThread(); crtThread =new Thread(recThread); crtThread.start(); } class RecThread implements Runnable{public void run(){try{listen();}catch(IOException e){e.printStackTrace();}}} // 监听客户端连接和数据 public void listen() throws IOException { System.out.println("start"); while (threadFlag) { if(threadFlag){ selector.select(); Set<SelectionKey> selectionKeys = selector.selectedKeys(); iterator = selectionKeys.iterator(); while (iterator.hasNext()) { selectionKey = (SelectionKey)iterator.next(); handleKey(); } } } if(selectionKey!=null){ selectionKey.cancel(); } selector.close(); }
然后执行 receiveData() 就可以启动线程进行监听,当关闭程序的时候,只需要在 关闭之前将 threadFlag 置为 false 就可以让线程自动退出
经过测试,我发现:如果客户端和服务端已经建立连接并且通信过,那么用上述的方法可以完全关闭程序,但是
如果只是服务端启动了监听线程而没有客户端连进来,这时候关闭服务端程序后javaw.exe依然在后台运行,虽然将线程的运行标志 threadFlag 置为了 false,但很显然线程依然
在运行,这我就搞不懂了,后来研究了一下发现只要线程代码里有 selector.select(); 那么这个线程就铁定关不掉,最后实在没有办法,使用
Runtime rt = Runtime.getRuntime(); String command = "taskkill /F /IM javaw.exe"; try { rt.exec(command); System.out.println("success closed"); } catch (IOException ex) { ex.printStackTrace(); }
- JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
- 使用Java NIO提高服务端程序的性能
- 使用Java NIO提高服务端程序的性能
- 使用Java NIO提高服务端程序的性能
- Java程序操作excel表格时遇到的奇怪问题
- CLOSE_WAIT导致服务端无法正常连接(JAVA、SOCKET相关)
- Java异常的奇怪问题
- 【Java】NIO 客户端关闭
- 求救!小弟写了一个java的服务端部分,但是无法正常关闭。
- java.lang.NoSuchMethodError导致Tomcat无法启动的问题
- Java的服务端程序性能问题调查方法
- Java的NIO之服务端的ServerSocketChannel的使用
- Eclipse异常关闭导致下次无法打开的问题
- JAVA NIO存在的问题
- JAVA NIO写服务端判断客户端断开连接的方法
- JAVA NIO写服务端判断客户端断开连接的方法
- Java中的奇怪问题?
- VB.NET关闭窗体时最小化(附带解决.NET程序导致XP无法关机重启的问题)
- 找出10个最大的文件并排序
- 基类和派生类的赋值规则
- 通过修改linux系统默认的TCP或UDP mem大小解决开发板播放流媒体片源卡顿或马赛克问题
- Paip.断点调试MYSQL存储过程跟函数的解决方案大法
- ICE的5个服务
- JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
- 博弈论之Nim博弈与sg函数(一)
- 张孝祥java多线程视频笔记----传统线程互斥技术
- ZOJ:3721 Final Exam Arrangement
- HDOJ 2389 - Hopcroft-Carp模板二分图最大匹配
- linux 下的文本处理之“行分割”——cut命令
- 【386w§Anobit推出第二代Genesis固态硬盘】
- Ural 1132. Square Root 二次剩余
- 批量测试服务器端口是否开放