Structured Concurrency — manages concurrent tasks with clear lifecycle (Java 21+ preview).
Key idea:
1try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {2 Subtask<String> user = scope.fork(() -> fetchUser());3 Subtask<Order> order = scope.fork(() -> fetchOrder());45 scope.join(); // Wait for both6 scope.throwIfFailed(); // Propagate errors78 return new Response(user.get(), order.get());9}
ShutdownOnFailure:
ShutdownOnSuccess:
How it works step-by-step:
scope.join() to wait for all tasks to complete.scope.throwIfFailed() to propagate errors.Real-world example:
1public Response getUserDashboard(Long userId) {2 try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {3 Subtask<User> userTask = scope.fork(() -> userService.getUser(userId));4 Subtask<List<Order>> ordersTask = scope.fork(() -> orderService.getOrders(userId));5 Subtask<Stats> statsTask = scope.fork(() -> statsService.getStats(userId));67 scope.join();8 scope.throwIfFailed();910 return new Response(userTask.get(), ordersTask.get(), statsTask.get());11 } catch (Exception e) {12 throw new DashboardException("Failed to load dashboard", e);13 }14}
Benefits:
System design context:
Common pitfalls: