java - 使用线程池时,如何让Java中的线程空闲?

标签 java multithreading server client threadpool

我正在开发一个服务器/客户端解决方案,它为每个连接的客户端创建一个新的服务器线程(将其添加到线程池)。服务器线程通过在客户端套接字输入流上调用 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) 循环)

您应该检查AsynchronousSocketChannelAsynchronousServerSocketChannel支持异步 IO 操作的类。为了能够使用这些类,您必须更改大部分客户端服务器通信逻辑。

查看以下链接,了解这些类的详细信息和示例用法。

https://www.javaworld.com/article/2853780/socket-programming-for-scalable-systems.html

https://webtide.com/on-jdk-7-asynchronous-io/

关于java - 使用线程池时,如何让Java中的线程空闲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383803/

相关文章:

java - Avatar.js 和项目头像

java - Junit 参数化测试与 Powermock 一起 - 如何?

javascript - 将 JavaScript NPM 项目与 Spring Boot 融合

python - 在 python 中使用线程处理多个最终用户

Java wait() 不会被 notify() 唤醒

java - FileOutputStream() 不起作用?

c# - 如何在线程中捕获正确的变量

apache - Apache mod_proxy和反向配置。

node.js - nginx 有时响应 504/502 网关超时错误

tomcat - 无法使用 POSTMAN 将数据发布到 Apache tomcat 服务器