読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Androidにおけるマルチスレッド処理を安全に行う

Android

概要

ExecutorServiceインターフェースを使ってAndroidでのマルチスレッド処理を行う

詳細

マルチスレッド処理はUIスレッド以外でネットワーク処理などをする必要があるAndroidにおいても不可欠なもの
ExecutorServiceインタフェースを実装することにより効率のよいスレッド処理を実現できる

ExecutorServiceは内部的にスレッドを管理しており、直接Threadを管理することはなくなる
各ThreadはTaskとして扱い、TaskはExecutorServiceを経由して扱う

ExecutorService内では各TaskをBlockingQueueインタフェースを実装したクラスで管理する
BlockingQueueを実装したクラスにはArrayBlockingQueue, LinkedBlockingQueueなどがある
名前の通りArrayかLinkedで作られているかの違い

また、ExecutorServiceは内部的にスレッドプールを保持している

実装例

ExecutorServiceを実装したクラスにはScheduledThreadPoolExecutor, ThreadPoolExecutorなどがある
また、Executorsクラスから一般的に使用される構成で設定したExecutorServiceを生成することも出来る、が今回は普通にコンストラクタから作ってみる

スレッドプールサイズ最小5、最大10のExecutorServiceを作ってみる

ExecutorService mThreadPood;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);

mThreadPool = new ThreadPoolExecutor(
    5,                        // 最小スレッドプールサイズ
    10,                       // スレッドプールサイズ上限、スレッドが増えた場合、ここまで増やす
    1,                        // スレッド数が初期サイズを超えた場合、アイドル時間、この時間を超えるとスレッドは廃棄される
    TimeUnit.SECONDS,         // 第三引数の単位
    sPoolWorkQueue            // スレッドを管理するBlockingQueueを実装したキュー
    );

for(int i = 0; i < 5; i++) {
    // ExecutorThreadからスレッドを取得し、実行
    mThreadPool.execute(new Runnable() {
        public void run() {
            // 非同期処理
        }
    });
}

何やらスレッドプール数はコアの数で決めるといいらしい

    private static int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();

参考

ExecutorService (Java Platform SE 6)
Creating a Manager for Multiple Threads | Android Developers

良いAndroidアプリを作る139の鉄則

良いAndroidアプリを作る139の鉄則