CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第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();
}

当然ながらhandleraccept(Throwable)メソッドはスレッドセーフでなければならない