ExecutorService の Java ドキュメントでこの例を取り上げました。このコードの流れを確認したかったのですが、 Executors.newFixedThreadPool はスレッドのプールを作成します(推測)。したがって、サーバーソケットは接続を待機し、接続を取得するとスレッドを開始するため、プールサイズは 1 減少します。スレッドの実行が終了すると、プールサイズは再び 1 増加しますよね? スレッドは使用したリソースを放棄しますか?
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();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
}