我正在使用套接字在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
的连接数,该怎么办?它是如何运作的?