Java Executror フレームワークについて

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

この本読んでて、非同期処理についてもう少し知ってないと厳しいと感じて、N予備校で勉強した並行処理のことを忘れるのでメモしておく。

Executror フレームワーク

スレッドインスタンスの生成は、

  • スレッドのインスタンス生成、終了の CPUコスト が大きい
  • スレッドがメモリを消費してしまう
  • スレッドには作成上限がある。大量のジョブ全てをスレッドに渡せない。上限スレッド数を超えたスレッドを作成しようとした場合、OutOfMemoryErrorとなる。

のようなデメリットがある。

Executrorフレームワークは予め定められたスレッドを生成しておきプーリング(スレッドプール)しておき、スレッドプールはタスクの実行要求があると待機中のスレッドにタスク実行を依頼する。

スレッドプーリングすることで上記デメリットの解決を測っている。

尚、アプリケーションが終了する時は必ずスレッドプール内のリソースを開放する必要がある。

実装例

import java.util.concurrent.{Callable, Executors}

val es = Executors.newFixedThreadPool(10)
val future = es.submit(new Callable[A] {
    override def call(): A = ??? // doTask
})
future.get()
es.shutdownNow() //スレッドの開放

タスクはCallable(結果あり)とRunnable(結果なし)のインスタンスとして定義する。

プール数以上のタスク要求があった場合、スレッドプールは各スレッドごとに割り当てるタスクキューを作成し、タスク終了したスレッドは順次、タスクキューを消化していく。