「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
簡単ですが、以上です。