Executorsクラス
スレッドプールを利用する – Executorsクラス- public static ExecutorService newFixedThreadPool(
- [int t [,ThreadFactory factory]])
- public static ExecutorService newSingleThreadExecutor
- ([ThreadFactory factory])
- public static ScheduledExecutorService
- newSingleThreadScheduledExecutor(
- [ThreadFactory factory])
- public static ScheduledExecutorService
- newScheduledThreadPool(
- int size [,ThreadFactory factory])
- t:スレッド数
- size:待機中でもプールに維持されるスレッド数
- factory:スレッド生成に利用するファクトリー
スレッドプールとは、スレッドをあらかじめいくつか用意しておき、再利用するしくみです。スレッドプールを利用することで、必要になる都度、スレッドを生成する必要がなくなりますので、パフォーマンスの改善が期待できます。
スレッドプールを利用するには、Executorsクラス(java.util.concurrentパッケージ)を利用します。Executorsクラスには、スレッドプールを生成するための以下のようなメソッドが用意されています。
Executorsクラスの主なメソッド | |
---|---|
メソッド | 概要 |
newFixedThreadPool | 指定数のスレッドを確保 |
newSingleThreadExecutor | 単一のスレッドを確保 |
newSingleThreadScheduledExecutor | 指定期間おきに実行するスレッド(単一スレッド) |
newScheduledThreadPool | 指定時間おきに実行するスレッド |
たとえば以下は、newFixedThreadPoolメソッドであらかじめスレッドを複数用意しておき、再利用する例です。
PoolSample.java
package com.example.mynavi.thread; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PoolSample { private static class MyThread implements Runnable { @Override public void run() { System.out.println(new Date()); } } public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(3); service.execute(new MyThread()); service.execute(new MyThread()); service.shutdown(); } }
Wed Aug 24 10:28:46 JST 2016 Wed Aug 24 10:28:46 JST 2016
スレッドプールからスレッドを取り出すには、ExecutorService#executeメソッドにRunnable実装オブジェクトを渡すだけです。スレッドの生成からプールに戻すまでの流れは、スレッドプールが管理するので意識する必要はありません。shutdownメソッドでスレッドプールを破棄します。