使用线程池时,如何让 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
我正在研究 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