java - 在关闭时可靠地关闭线程池中的客户端套接字

标签 java sockets network-programming threadpool

我有一个简单的基于 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/

相关文章:

java - 使用java在JSP中生成随机数

java - KieScanner 不在运行时更新 KieSessions

java - 替换结果的html

linux - 什么是关于套接字的 z/TPF 系统?

c - 发现 IP 地址是 DHCP 还是静态

linux - Tap接口(interface)和/dev/net/tun设备,使用ip tuntap命令

java - 无法运行 mvn vaadin :compile on Vaadin Maven project

html - 我可以在 Windows Phone 8 应用程序中使用 Node.js 吗?

objective-c - 在 Cocoa 应用程序上调用 CFRunLoop 系列

c# - Pure Aloha 协议(protocol)的模拟