ExecutorServiceの比較

| コメントをどうぞ

ExecutorServiceのnewSingleThreadExecutor、newFixedThreadPool、newCachedThreadPoolを比較してみる。

共通クラス(Runnable)

共通クラスでRunnableインターフェイスを実装する。

public class TestLogic implements Runnable {
    private int id;
    public TestLogic(int id) {
        this.id = id;
    }
    @Override
    public void run() {
        System.out.println("run(" + id + ")#begin - " + Thread.currentThread().getId());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
        System.out.println("run(" + id + ")#end - " + Thread.currentThread().getId());
    }
}

newSingleThreadExecutor

1つのスレッドを使いまわすExecutorです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewSingleThreadExecutor {
    public static void main(String[] args) {
        ExecutorService exec = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            System.out.println("main(" + i + ")#submit - " + Thread.currentThread().getId());
            exec.submit(new TestLogic(i));
        }
        exec.shutdown();
    }
}

実行結果はこちら

main(0)#submit - 1
main(1)#submit - 1
main(2)#submit - 1
main(3)#submit - 1
run(0)#begin - 9
main(4)#submit - 1
run(0)#end - 9
run(1)#begin - 9
run(1)#end - 9
run(2)#begin - 9
run(2)#end - 9
run(3)#begin - 9
run(3)#end - 9
run(4)#begin - 9
run(4)#end - 9

スレッドid:9しか使われないので、処理がシリアライズされる。

newFixedThreadPool

指定した数のスレッドを使いまわすExecutorです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewFixedThreadPool {
    public static void main(String[] args) {
        ExecutorService exec = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 5; i++) {
            System.out.println("main(" + i + ")#submit - " + Thread.currentThread().getId());
            exec.submit(new TestLogic(i));
        }
        exec.shutdown();
    }
}

実行結果はこちら

main(0)#submit - 1
main(1)#submit - 1
run(0)#begin - 9
run(1)#begin - 10
main(2)#submit - 1
main(3)#submit - 1
main(4)#submit - 1
run(2)#begin - 11
run(0)#end - 9
run(1)#end - 10
run(2)#end - 11
run(3)#begin - 9
run(4)#begin - 10
run(4)#end - 10
run(3)#end - 9

スレッドid:9,10,11が生成され、3つのスレッドが同時に実行される。

newCachedThreadPool

60秒間キャッシュされるスレッドプールを持つExecutorです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewCachedThreadPool {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            System.out.println("main(" + i + ")#submit - " + Thread.currentThread().getId());
            exec.submit(new TestLogic(i));
        }
        Thread.sleep(5000);
        System.out.println("---");
        for (int i = 0; i < 5; i++) {
            System.out.println("main(" + i + ")#submit - " + Thread.currentThread().getId());
            exec.submit(new TestLogic(i));
        }
        Thread.sleep(70000);
        System.out.println("---");
        for (int i = 0; i < 5; i++) {
            System.out.println("main(" + i + ")#submit - " + Thread.currentThread().getId());
            exec.submit(new TestLogic(i));
        }
        exec.shutdown();
    }
}

実行結果はこちら

main(0)#submit - 1
main(1)#submit - 1
main(2)#submit - 1
run(0)#begin - 9
run(1)#begin - 10
main(3)#submit - 1
run(2)#begin - 11
main(4)#submit - 1
run(3)#begin - 12
run(4)#begin - 13
run(0)#end - 9
run(1)#end - 10
run(4)#end - 13
run(3)#end - 12
run(2)#end - 11
---
main(0)#submit - 1
run(0)#begin - 11
main(1)#submit - 1
main(2)#submit - 1
run(1)#begin - 12
run(2)#begin - 13
main(3)#submit - 1
main(4)#submit - 1
run(3)#begin - 9
run(4)#begin - 10
run(1)#end - 12
run(3)#end - 9
run(4)#end - 10
run(2)#end - 13
run(0)#end - 11
---
main(0)#submit - 1
main(1)#submit - 1
run(0)#begin - 14
main(2)#submit - 1
run(1)#begin - 15
main(3)#submit - 1
run(2)#begin - 16
main(4)#submit - 1
run(3)#begin - 17
run(4)#begin - 18
run(0)#end - 14
run(1)#end - 15
run(3)#end - 17
run(4)#end - 18
run(2)#end - 16

スレッドid:9,10,11,12,13が生成され、5つのスレッドが同時に実行される。
5秒後に同じスレッドを使って実行される。
70秒後には異なるスレッド(スレッドid:14,15,16,17,18)を使って実行される。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>