使用线程池时,如何使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操作的类和类。为了能够使用这些类,您必须更改大多数客户机-服务器通信逻辑 查看以下链接以了解这些类的详细信息和示例用法
所以,您希望一个线程处理多个客户端,对吗?不,在我的第一个代码片段中,我为每个连接到套接字的客户端创建一个新线程。因此,每个客户端都有一个服务器线程,每个服务器线程处理其消息,并将该消息发送给所有其他客户端(这是一个聊天程序)。在这种情况下,您应该增加线程池中的线程数。你不能只是“重用”一个线程,它正在等待一些东西。所以,你想让一个线程处理多个客户端,对吗?不,在我的第一个代码片段中,我为每个连接到套接字的客户端创建一个新线程。因此,每个客户端都有一个服务器线程,每个服务器线程处理其消息,并将该消息发送给所有其他客户端(这是一个聊天程序)。在这种情况下,您应该增加线程池中的线程数。你不能只是“重用”一个线程,它正在等待一些东西。