import java.util.*; import java.util.concurrent.*; import java.util.concurrent.StructuredTaskScope.Joiner; /** Five tasks that sleep a random time and fail if they were "too slow". Seeded, so the transcript is repeatable. */ public class RandomTasks { static class TooSlowException extends Exception { TooSlowException(String m) { super(m); } } public static void main(String[] args) throws Exception { long seed = Long.parseLong(args[0]); int threshold = 700; Random random = new Random(seed); List> tasks = new ArrayList<>(); for (int i = 0; i < 5; i++) { int duration = random.nextInt(1000); System.out.println("Duration: " + duration); tasks.add(() -> { Thread.sleep(duration); if (duration > threshold) throw new TooSlowException("Duration " + duration + " greater than threshold " + threshold); return duration; }); } try (var scope = StructuredTaskScope.open(Joiner.allSuccessfulOrThrow())) { tasks.forEach(scope::fork); for (int r : scope.join()) System.out.println("Result: " + r); } catch (ExecutionException e) { System.out.println("ExecutionException: " + e.getCause().getClass().getSimpleName() + ": " + e.getCause().getMessage()); } } }