我有一个简单的基于 ServerSocket 的 java 程序,它接受客户端连接并将其放入线程池 (ThreadPoolExecutor):
while() {
socket = serverSocket.accept();
pool.submit(new Client(socket)); // Client is a Runnable
}
问题是当我尝试关闭程序时,客户端线程一直存在,直到连接在另一端关闭(jvm 直到那时才退出)。
我可以尝试维护所有客户端对象并在服务器即将关闭时关闭它们的所有套接字。但我不知道如何维护它们?尤其是完成后删除它们。
我试过了 beforeExecute等等,但这只会给我另一个对象(一个 FutureTask),而不是我正在寻找的 Client 对象。
更新:
问题不在于将套接字添加到列表中,问题在于完成后将其删除,因为没有办法(afaik)为此使用 afterExecute。
最佳答案
在将所有套接字提交到池之前,将它们存储在List
中。然后关闭线程可以在所有套接字上调用 close()
,这应该会导致被阻塞的线程抛出 SocketException
。
关于java - 在关闭时可靠地关闭线程池中的客户端套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25528634/