$ javac src/Joiners.java && java Joiners (28-beta+21-ea) -- allSuccessfulOrThrow(): List in FORK order, not completion order [slow, fast, medium] -- allSuccessfulOrThrow(): one failure cancels the others, join() throws ExecutionException ExecutionException, cause = java.lang.IllegalStateException: broken failed interrupted: [slow] -- anySuccessfulOrThrow(): the race; losers are interrupted winner: B-50ms interrupted: [A-300ms, C-300ms] -- anySuccessfulOrThrow(): when every subtask fails ExecutionException, cause = java.lang.IllegalStateException: one failed -- awaitAllSuccessfulOrThrow(): returns null (Void), like the zero-argument open() join() = null, a=a, b=b -- allUntil(predicate): stop when two subtasks have completed SUCCESS t1 SUCCESS t2 UNAVAILABLE UNAVAILABLE interrupted: [t3, t4] -- the Function overload: join() throws OUR exception type caught ServiceException: service call failed: orders failed