Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

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

スレッド
Threadクラス/Runnableインターフェイス
synchronized修飾子/ブロック
ReentrantLockクラス
AtomicXxxxxクラス
Executorsクラス

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職