Java 线程池执行器和大量客户端同时连接

Java 线程池执行器和大量客户端同时连接,java,multithreading,Java,Multithreading,我正在用套接字在Java上构建一个客户机-服务器应用程序。据我所知,为每个连接的客户端创建一个线程太昂贵了。相反,我们可以使用线程池执行器。正如在concurrent中所说的,我们可以创建一个固定大小的线程池 class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkS

我正在用套接字在Java上构建一个客户机-服务器应用程序。据我所知,为每个连接的客户端创建一个线程太昂贵了。相反,我们可以使用
线程池执行器
。正如在concurrent中所说的,我们可以创建一个固定大小的线程池

class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize)
       throws IOException {
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() { // run the service
     try {
       for (;;) {
         pool.execute(new Handler(serverSocket.accept()));
       }
     } catch (IOException ex) {
       pool.shutdown();
     }
   }
 }

而且似乎我们在每个时间点上最多运行
poolSize
线程。但是,如果我们需要维护的连接数量超过
poolSize
,该怎么办呢。它是如何工作的?

如果你要拥有一个真正的<强>大/强的客户端数量,你就应该考虑<强> NIO <强>,因为每个客户端的线程创建代价太高。 NIO使用选择器和通道,不需要为每个连接创建新线程。看


你听说了吗?我不知道您将要实现什么,但它似乎会有用。

不会。你的客户端将阻塞,直到有线程可用。增加
池大小
?@ScottHunter我需要,比方说,保持1000个客户端同时连接。这是否意味着我必须创建1000个线程?Java中的池大小有一个阈值(您可以增加池数,但不会有任何收益)。我不记得号码了。@MladenUzelac那么解决办法是什么?啊,好的。。。我明白了。。。或多或少地)好吧,我正在尝试实现一个简单的客户机-服务器massenger,它可以同时维护500-1000个连接。我的意思是,你的意思是NIO在那里是必要的吗?500-1000它远远不是巨大的:)不,对于你的情况来说,普通的阻塞IO服务器就足够了,因为它更容易,但是如果你的系统长大了。。。《Netty in Action》一书的作者建议只对1000+并发连接使用NIO。例如,nioservernetty可以处理数十个甚至数十万个并发连接。