読者です 読者をやめる 読者になる 読者になる

「Java」スレッドプールのサンプル (Executors#newFixedThreadPool)

Executors#newFixedThreadPool 使ってスレッドをプールさせるサンプル書いてみました。

・Executors (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/Executors.html


なんとなくソケット使ったサンプルにしてみました。
accept で受けたリクエストを Executors#newFixedThreadPool でプールしたスレッドで処理してレスポンス返すって感じのことをやってます。

■ ThreadPoolTest.java

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolTest {
  public static void main(String[] args) {
    ExecutorService es = Executors.newFixedThreadPool(5);

    try (ServerSocket ss = new ServerSocket(8888);) {
      while (true) {
        Socket socket = ss.accept();
        new ThreadPoolTest().response(socket, es);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  private void response(Socket s, ExecutorService e) throws IOException {
    e.execute(new Runnable() {
      @Override
      public void run() {
        DataOutputStream dos = null;
        try {
          dos = new DataOutputStream(s.getOutputStream());
          dos.writeBytes(Thread.currentThread().getId() + " : " + Thread.currentThread().getName());
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          try {
            dos.close();
            s.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    });
  }
}


以下のエントリーで書いた ClientSample.java を適当回数ループさせてリクエストすると、後述の出力が得られます。ちゃんとプールされたスレッドで処理されてますね。

・「Java」リモートデバッグ - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2013/08/01/011321

11 : pool-1-thread-1
12 : pool-1-thread-2
13 : pool-1-thread-3
14 : pool-1-thread-4
15 : pool-1-thread-5
11 : pool-1-thread-1
12 : pool-1-thread-2
13 : pool-1-thread-3
14 : pool-1-thread-4
15 : pool-1-thread-5


簡単ですが、以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25