第3章 ラムダ式を使ったプログラミング : 問題 17 : ラムダ式と例外 その2
問題
first と second を並列に実行し、どちらかのメソッドが例外をスローしたら handler を呼び出すメソッド
void doInParallelAsync(Runnable first, Runnable second, Consumer<Throwable> handler)
を実装せよ
解答
まずRunnable
で起こった例外を処理する新たなRunnable
を生成するメソッドを導入する
■ Runnable
生成
private static Runnable handle(Runnable runner, Consumer<Throwable> handler) { return () -> { try { runner.run(); } catch (Throwable th) { handler.accept(th); } }; }
これを使うとdoInParallelAsync
は簡単
■ doInParallelAsync
メソッド
public static void doInParallelAsync(Runnable first, Runnable second, Consumer<Throwable> handler) { new Thread(handle(first, handler)).start(); new Thread(handle(second, handler)).start(); }
当然ながらhandler
のaccept(Throwable)
メソッドはスレッドセーフでなければならない