JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题

使用NIO进行SOCKET通信,服务端核心代码如下

@Overridepublic void receiveData()throws IOException{// TODO Auto-generated method stubrecThread = 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服务端程序无法关闭的奇怪问题

相关文章:

你感兴趣的文章:

标签云: