New candidate JEP: 462: Structured Concurrency (Second Preview)

David Alayachew davidalayachew at gmail.com
Fri Oct 27 22:09:35 UTC 2023


> The current situation seems kinda clunky with
> using one stream to collect futures, and yet
> another stream to collect results. Maybe one
> of the Java architects hates such boilerplate,
> and will come up with an elegant way to
> reduce/remove such boilerplate.

I can sympathize, but I think it is clearer this way. It's obvious from a
glance that all the work of scope forking occurs before performing a join.
And a join occurs before any of the tasks have get called on them.

I struggle to see a way to join that into one stream while maintaining that
clarity.


On Fri, Oct 27, 2023 at 12:37 PM Eric Kolotyluk <eric at kolotyluk.net> wrote:

> Looks good... thanks.
>
> One slight area of confusion for me was,
>
> <T> List<Future<T>> executeAll(List<Callable<T>> tasks)
>         throws InterruptedException {
>     try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
>     	  List<? extends Supplier<Future<T>>> futures = tasks.stream()
>     	      .map(task -> asFuture(task))
>      	      .map(scope::fork)
>      	      .toList();
>     	  scope.join();
>     	  return futures.stream().map(Supplier::get).toList();
>     }
> }
>
> static <T> Callable<Future<T>> asFuture(Callable<T> task) {
>    return () -> {
>        try {
>            return CompletableFuture.completedFuture(task.call());
>        } catch (Exception ex) {
>            return CompletableFuture.failedFuture(ex);
>        }
>    };
> }
>
> And what happens if ShutdownOnSuccess is called instead. Eventually I
> reasoned that the right thing should happen, but there should only ever be
> one element in the list. Does the scope guarantee only one result?
>
>    1. It would be slightly helpful to point this out in a note so that it
>    is more obvious.
>    2. What is less obvious is that with ShutdownOnSuccess what happens if
>    one or more of the siblings throw an exception?
>       - I would hope that so long at least one task succeeds, this should
>       not cause the overall success of the scope to fail.
>       - It would be nice to see this explained more clearly.
>       -  Maybe ShutdownOnSuccess deserves its own example, discussing
>       possible edge cases.
>
> Somehow I am remembering Scala 'for comprehensions' with concurrent tasks
> that 'yield' a result... 😉
>
> The current situation seems kinda clunky with using one stream to collect
> futures, and yet another stream to collect results. Maybe one of the Java
> architects hates such boilerplate, and will come up with an elegant way to
> reduce/remove such boilerplate.
>
> Sincerely, Eric
> On 2023-10-27 7:39 a.m., Mark Reinhold wrote:
>
> https://openjdk.org/jeps/462
>
>   Summary: Simplify concurrent programming by introducing an API for
>   structured concurrency. Structured concurrency treats groups of related
>   tasks running in different threads as a single unit of work, thereby
>   streamlining error handling and cancellation, improving reliability,
>   and enhancing observability. This is a preview API.
>
> - Mark
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/loom-dev/attachments/20231027/621ffeca/attachment-0001.htm>


More information about the loom-dev mailing list