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

时间:2019-03-27 18:02:25

标签: 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
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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