3

我编写了一个小 TCP 线程服务器,它为每个 server.accept() 创建一个新线程。几乎一切都很好,但我在每次中断时杀死所有线程时遇到问题。(我使用 ServiceExecutor 来管理线程。因此我使用 shutdownNow 方法来访问中断方法) Worker 实例使用 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 以终止输入/输出流,但它没有按预期工作。

4

1 回答 1

4

几个选择:

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

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

于 2012-10-29T10:26:15.907 回答