JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
2013-08-19 17:32
323 查看
使用NIO进行SOCKET通信,服务端核心代码如下
然后执行 receiveData() 就可以启动线程进行监听,当关闭程序的时候,只需要在 关闭之前将 threadFlag 置为 false 就可以让线程自动退出
经过测试,我发现:如果客户端和服务端已经建立连接并且通信过,那么用上述的方法可以完全关闭程序,但是
如果只是服务端启动了监听线程而没有客户端连进来,这时候关闭服务端程序后javaw.exe依然在后台运行,虽然将线程的运行标志 threadFlag 置为了 false,但很显然线程依然
在运行,这我就搞不懂了,后来研究了一下发现只要线程代码里有 selector.select(); 那么这个线程就铁定关不掉,最后实在没有办法,使用
这个很笨的方法彻底关闭了程序……
@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(); }
这个很笨的方法彻底关闭了程序……
相关文章推荐
- 奇怪问题,Android项目中含有return.9.png资源文件导致项目报错无法编译出R.java文件
- VB.NET关闭窗体时最小化(附带解决.NET程序导致XP无法关机重启的问题)
- Win7运行程序总提示出现一个问题,导致程序停止正常工作。请关闭该程序?原来GreenBrowser下载有问题……
- 求救!小弟写了一个java的服务端部分,但是无法正常关闭。
- C#程序导致MFDeploy无法ping通的问题
- 解决WinForm 程序中由于拖拽导致MouseUp事件无法触发的问题
- 程序开过多线程,导致hadoop作业无法运行成功——Call to hadoop1:9000 failed on lo cal exception: java.io.IOException: Coul
- CLOSE_WAIT导致服务端无法正常连接(JAVA、SOCKET相关)
- C#程序导致MFDeploy无法ping通的问题
- [JAVA]Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题
- android问题:控件id不能在R.java里自动创建,导致在Activity中无法获取控件
- 导出的Java程序无法连接数据库的问题解决方案
- Java程序操作excel表格时遇到的奇怪问题
- eclipse在异常关闭后,导致无法启动workspace问题的解决
- java环境配置为1.7jdk为什么cmd java -version查看版本是1.8||win7 java(tm) platform se binary 已停止工作 出现了一个问题,导致程序停止正常
- 由关闭通知导致Toast无法正常显示到Java中的反射
- selenium java 程序 无法打开火狐及相关问题
- 解决无法在java程序中运行cmd命令的问题
- java main执行时如果外部资源没有关闭可能导致报错后程序不退出一直等待