gpt4 book ai didi

java - 对服务器套接字客户端使用 Executor 而不是新线程

转载 作者:行者123 更新时间:2023-11-30 04:50:02 26 4
gpt4 key购买 nike

我目前正在编写一个多个客户端将连接到的服务器。通信协议(protocol)基本上是服务器向客户端发送任务,客户端在任务执行时做出响应。客户端与服务器保持连接并且永远不应断开连接。

目前我正在启动一个新线程来处理每个客户端。本质上,我当前的解决方案是这样的:(来源 Java Concurrency in practice )

public class ThreadPerTaskWebServer {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(80);
while (true) {
final Socket connection = socket.accept();
Runnable task = new Runnable() {
public void run() {
handleRequest(connection);
}
};
new Thread(task).start();
}
}

private static void handleRequest(Socket connection) {
// request-handling logic here
}
}

但我想使用执行器,因为它们看起来更稳定并且扩展性更好。因此,为了使服务器能够向客户端发送消息,我需要与运行客户端的执行程序分开跟踪客户端。因此,如果我将客户端放置在 CopyOnWriteArrayList 客户端中的位置,然后在 Server 类中添加类似的内容:

Socket clientSocket = serverSocket.accept();
// The runnable that takes care of a client
ClientHandler c = new ClientHandler(clientSocket, this);
// Start executing the ClientHandler
exec.execute(c);
// Add clients to CopyOnWriteArrayList
clients.add(c);

这将允许我迭代 CopyOnWriteArrayList 以便向所有客户端发送命令并删除断开连接的客户端。这是一个可靠的解决方案吗?如果可运行程序由于某种原因向执行程序传播异常,那么执行程序会发生什么情况?

最佳答案

Would this the an robust solution?

是的,我想是的。您需要确保在固定大小池中分配正确数量的线程或使用动态池。

What would happen with the Executor if a runnable for some reason would propagate an exception to it?

如果您的代码抛出RuntimeException,那么执行代码的执行程序池线程将停止,但池线程计数将减少,并且如果服务尚未关闭,则会创建另一个线程。因此线程池将继续正常运行。

This would allow me to iterate over the CopyOnWriteArrayList in order to send commands to all the clients and also remove disconnected ones

当然,您不需要删除断开连接的连接,除非您要保存对它们的引用。否则我无法真正评论这个要求。

关于java - 对服务器套接字客户端使用 Executor 而不是新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10034670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com