Javaの非同期も随分簡単になって、Thread管理クラスを作ってThreadを起こして終了を拾って〜などとやっていた頃が夢のように。
基本的にはコレクションのstreamをparallelで処理、という具合だが業務系では大抵の処理は
・多重度の設定
・全終了の待機
が必要になる。
で、そんな場合のために、ForkJoinPoolクラスが存在していて、だいたい次のように。
private void foo() throws Exception
{
Map<String, String> mp = new HashMap<String, String>(){
{{ put("a", "A"); }}
{{ put("b", "B"); }}
{{ put("c", "C"); }}
{{ put("d", "D"); }}
{{ put("e", "E"); }}
};
var pool = new ForkJoinPool(20); //多重度をセット
pool.submit(()->mp.entrySet().parallelStream().forEach((x)->{
System.out.println(x.getKey() + " : " + x.getValue());
})).get(); //全終了を待機
System.out.println("parallel-end");
}
非同期処理が込み入ったものであれば、ラムダ内から処理用の関数を呼ぶようにすれば良く、更に同期処理が必要なのであれば呼ばれる関数にsynchronized修飾子をつけておけば良い。
ま、常駐型のスレッドが必要な場合はやっぱりそれなりに管理用クラスを用意して上げたほうがいぢり易くはあるんだが。