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

How do you make a thread idle in Java when using a thread pool?

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

如前所述,如果 FixedThreadPool 已经 运行ning MAX_CLIENTS,则不会执行任何新客户端。

根据您当前的设计,随着客户端数量的增加,您将 运行 线程不足。如果您的线程池大小为 20 个线程,则您无法同时处理 21 个客户端。因为套接字操作是阻塞操作。(并且您的 ChatServer class 将使执行线程忙于 while(true) 循环)

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

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

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

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