我正在开发一个服务器/客户端解决方案,它为每个连接的客户端创建一个新的服务器线程(将其添加到线程池)。服务器线程通过在客户端套接字输入流上调用 readLine() 来等待来自关联客户端的消息。如果我将线程池设置为 1 并连接第二个客户端,则在第一个线程关闭之前,线程池不会执行该客户端。我的印象是,如果线程只是等待 readLine(),线程池会自动空闲线程,但我想情况并非如此。我将如何创建这样一个程序?
这是创建连接到客户端的新服务器线程的服务器循环:
private final static Executor executor = Executors.newFixedThreadPool(MAX_CLIENTS);
while (true) {
clientSocket = serverSocket.accept();
executor.execute(new ChatServer(clientSocket, allClients));
}
运行方法的工作原理如下:
socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())
while(true) {
inputLine = socketReader.readLine();
//then send input line to all clients
}
如上所述,如果固定线程池已经在运行MAX_CLIENTS
,则不会执行任何新客户端。
最佳答案
根据您当前的设计,随着客户端数量的增加,您将耗尽线程。如果您的线程池大小为 20 个线程,则您无法同时处理 21 个客户端。因为套接字操作是阻塞操作。(并且您的 ChatServer 类将使执行线程忙于 while(true) 循环)
您应该检查AsynchronousSocketChannel和 AsynchronousServerSocketChannel支持异步 IO 操作的类。为了能够使用这些类,您必须更改大部分客户端服务器通信逻辑。
查看以下链接,了解这些类的详细信息和示例用法。
https://www.javaworld.com/article/2853780/socket-programming-for-scalable-systems.html
关于java - 使用线程池时,如何让Java中的线程空闲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383803/