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メソッドでスレッドプールを破棄します。






