この本読んでて、非同期処理についてもう少し知ってないと厳しいと感じて、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(結果なし)のインスタンスとして定義する。
プール数以上のタスク要求があった場合、スレッドプールは各スレッドごとに
割り当てるタスクキューを作成し、タスク終了したスレッドは順次、タスクキューを消化していく。
リンク
リンク