2012-10-29 122 views
3

我编写了一个小的TCP线程服务器,它为每个server.accept()创建一个新的线程。几乎所有的工作都很好,但是我遇到了每个中断都要杀死所有线程的问题。 (我使用ServiceExecutor来管理线程,因此我使用shutdownNow方法来访问中断方法)Worker-instances使用BufferedReader,它是readline方法来接收和计算输入。 AFAIK readline块不会对中断发生反应,但是如何阻止它呢?关闭TCP线程服务器

while(!isInterrupted()){ 

    try { 
      clientSocket = this.serverSocket.accept(); 
     } catch(IOException e){ 
      break; 
     } 

     this.threadPool.execute(new ThreadWorker(clientSocket)); 
    } 

    threadPool.shutdownNow(); 

    try{ 
     serverSocket.close(); 
    }catch(IOException e){ 
     //todo 
    } 

我试图关闭的ServerSocket杀输入/输出流,但如预期没有奏效。

+3

理想情况下,不要调用无限期阻塞的方法。 –

+0

参见http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java?rq=1和http://stackoverflow.com/questions/1948317/forceful-termination线程卡在某种方法上的某种方法?rq = 1 – DNA

+0

在'C'中,我会说只是发送一个信号。 – alk

回答

4

几个选择:

1)如果您关闭整个应用程序,并没有什么重要意义的显式关闭,调用System.exit(0)。健康警告 - 这样做会导致一些开发人员发生中风,并无休止地发出“优雅地清理”信息。

2)保留accept()线程中所有客户端套接字的线程安全列表。将对此列表的引用作为客户端上下文的一部分传递给客户端服务器线程。在accept()线程中向列表中添加新连接。当客户端线程检测到断开连接时,从列表中删除它的条目。当你想关闭所有客户端时,迭代列表并关闭客户端套接字 - 这将导致readline方法在客户端线程中提前返回,并出现错误。

+0

+1为'中风'。 – grieve