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

使用线程池时,如何使Java中的线程空闲?,java,multithreading,server,client,threadpool,Java,Multithreading,Server,Client,Threadpool,我正在开发一个服务器/客户机解决方案,它为每个连接的客户机创建一个新的服务器线程(将其添加到线程池)。服务器线程通过调用客户机套接字输入流上的readLine(),等待来自关联客户机的消息。如果我将线程池设置为1并连接第二个客户机,则在第一个线程关闭之前,线程池不会执行该线程池。我的印象是,如果线程池只是在readLine()上等待,它会自动空闲线程,但我想情况并非如此。我将如何着手创建这样一个程序 这是创建连接到客户端的新服务器线程的服务器循环: private final static Ex

我正在开发一个服务器/客户机解决方案,它为每个连接的客户机创建一个新的服务器线程(将其添加到线程池)。服务器线程通过调用客户机套接字输入流上的
readLine()
,等待来自关联客户机的消息。如果我将线程池设置为1并连接第二个客户机,则在第一个线程关闭之前,线程池不会执行该线程池。我的印象是,如果线程池只是在readLine()上等待,它会自动空闲线程,但我想情况并非如此。我将如何着手创建这样一个程序

这是创建连接到客户端的新服务器线程的服务器循环:

private final static Executor executor = Executors.newFixedThreadPool(MAX_CLIENTS);

while (true) {
    clientSocket = serverSocket.accept();
    executor.execute(new ChatServer(clientSocket, allClients));
}
run方法的工作原理如下:

socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())

while(true) {
    inputLine = socketReader.readLine();
    //then send input line to all clients
}

如前所述,若FixedThreadPool已经在运行
MAX_客户端
,则不会执行新的客户端。

使用当前设计,随着客户端数量的增加,线程将耗尽。如果线程池的大小为20个线程,则无法同时处理21个客户端。因为套接字操作是阻塞操作。(并且您的ChatServer类将使执行线程在while(true)循环中保持忙碌)

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

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


在当前的设计中,随着客户端数量的增加,线程将耗尽。如果线程池的大小为20个线程,则无法同时处理21个客户端。因为套接字操作是阻塞操作。(并且您的ChatServer类将使执行线程在while(true)循环中保持忙碌)

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

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


所以,您希望一个线程处理多个客户端,对吗?不,在我的第一个代码片段中,我为每个连接到套接字的客户端创建一个新线程。因此,每个客户端都有一个服务器线程,每个服务器线程处理其消息,并将该消息发送给所有其他客户端(这是一个聊天程序)。在这种情况下,您应该增加线程池中的线程数。你不能只是“重用”一个线程,它正在等待一些东西。所以,你想让一个线程处理多个客户端,对吗?不,在我的第一个代码片段中,我为每个连接到套接字的客户端创建一个新线程。因此,每个客户端都有一个服务器线程,每个服务器线程处理其消息,并将该消息发送给所有其他客户端(这是一个聊天程序)。在这种情况下,您应该增加线程池中的线程数。你不能只是“重用”一个线程,它正在等待一些东西。