ExecutorServiceを利用したバックグラウンド処理
ExecutorServiceは複数のスレッドを一括で管理してくれる便利な機能です。
ExecutorServiceの生成
インスタンスの生成には複数の方法があります。インスタンスの生成方法でスレッドの実行方法を指定します。
submit()
されたスレッドを並列に処理する
submit()
されたスレッドを順番に実行する
submit()
されたスレッドを並列に処理するが、最大同時実行スレッド数を指定できる。下記の場合は最大同時スレッド数2
スレッドの実行(タスクの送信)
下記で実行します。
スレッドに空きが出来たら実行します。スレッドに空きがある場合は即実行します。
Thread は Runnable を implements している。
ExecutorServiceの終了(シャットダウン)
下記で順序正しくシャットダウンを開始します。送信済みのタスクは実行されます。
バックグラウンド処理の終了まで待機させる
submit()
の戻り値に対して、future.get()
することで、そのスレッドが終了するまで待機します。下記は実行中の全スレッドが終るまで待つ場合。
バックグラウンド処理の終了まで一定時間待機させる
ExecutorService
のメソッドです。shutdown()
実行後にコールします。
基本的な使い方
バックグラウンド処理クラス
呼び出し側 - バックグラウンド処理の終了を待たない
呼び出し側 - バックグラウンド処理の終了まで待機する
使い方の応用
メインスレッドからバックグラウンドスレッドへ順次データを渡して処理させる方法です。
データの受け取りにはLinkedBlockingQueue
を使います。
offer()
キューの末尾に要素を挿入しますtake()
キューの先頭を取得して削除します
必要に応じて、要素が利用可能になるまで待機します
終了時にはsetExit()
で終了オブジェクトをキューに設定します。take()
で終了オブジェクトを取得するとスレッドを終了します。
バックグラウンドスレッドに渡すデータキューの部分
sModelExit
は終了オブジェクト。