关闭TCP线程服务器

时间:2012-10-29 09:34:09

标签: java multithreading tcp interrupt

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

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以终止输入/输出流,但它没有按预期工作。

1 个答案:

答案 0 :(得分:4)

几种选择:

1)如果要关闭整个应用程序,并且没有明确关闭的重要性,请调用System.Exit(0)。健康警告 - 这样做会导致一些开发人员中风,并且无休止地发布“优雅地清理”。

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