1

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
 }
}
4

3 に答える 3

1

スレッドが実行を終了すると、プールサイズは再び 1 ずつ増加しますよね?

はい。スレッドは、次の を取得して実行しHandlerます。

スレッドは使用したリソースを放棄しますか?

すぐにではありません。Handler run()メソッドが終了すると、Handlerは範囲外になります。Handlerただし、インスタンスが解放される前に、ガベージ コレクターが実行されるまで待つ必要があります。Socketこれにより、ガベージ コレクション自体の候補となる解放が行われます。

Socketより早くリリースしたい場合(これが問題だと思います)、run()メソッドの最後でそれを行う必要があります。ブロック内で呼び出すことができますsocket.close()(そしておそらく be に設定socketすることもできますnull) finally。次のようなものが推奨されます。

class Handler implements Runnable {
    ...
    public void run() {
       try {
           // read and service request on socket
       } finally {
           // make sure we close the socket when the handler is finishing
           socket.close();
       }
    }
}
于 2012-08-29T18:41:39.240 に答える
0

スレッドが行うのは、を実行することだけです Runnableしたがって、タスクが実行
さ れた後にクリーンを実行する必要がある場合は、から実行する必要があります。プールは単なるパターンの実装であり、スレッドのライフサイクルを管理する役割を果たします。 スレッドはキューで渡したタスクを実行するため、この場合、スレッド間で再利用されることはありません。スコープは内部にありますRunnableProducerConsumer
socketRunnable

于 2012-08-29T18:40:25.213 に答える
0

これは fixedThreadPool であるため、タスクがプールに送信されるたびにプール サイズが縮小され、スレッドが送信された runnable (または callable) の実行を完了すると増加します。より多くのランナブルを固定スレッド プールに送信すると、プール内のいずれかのスレッドが以前に送信されたタスクの実行を完了するまでブロックされます。

于 2012-08-29T18:43:45.750 に答える