ThreadPool执行器和大量客户端同时连接

时间:2014-11-16 13:18:23

标签: java multithreading

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

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的连接数,该怎么办?它是如何运作的?

1 个答案:

答案 0 :(得分:3)

如果你真的有巨大数量的客户,你应该考虑 NIO ,因为为每个客户创建线程太贵了。

NIO使用选择器和通道,并不需要为每个连接创建新线程。请参阅image

你听说过netty了吗?我不知道你要实施什么,但似乎它会有用。