Interrupt Handlers

Alex Otenko oleksandr.otenko at gmail.com
Tue Dec 21 08:25:19 UTC 2021


If you rewrite cause->... as (InterruptedException
interruptedException)->..., you will see that all the boilerplate you saved
is the words try, catch and typing.

Alex

On Tue, 21 Dec 2021, 00:42 Eric Kolotyluk, <eric at kolotyluk.net> wrote:

> Not for JDK 18 or Project Loom, but while we are thinking about Concurrency
> APIs, one thing that has always bugged me is Thread.sleep() because it
> looks like
>
> try {
>     . . .
>     Thread.sleep(Duration.ofMillis(10))
>     . . .
> }
> catch (InterruptedException cause) {
>     . . .
> }
>
> which is too much boilerplate... In my own APIs I do stuff like
>
> public Duration sleep(Consumer<InterruptedException> exceptionHandler) {
>     final var duration = getDuration();
>     try {
>         Thread.sleep(duration);
>     } catch (InterruptedException interruptedException) {
>         if (exceptionHandler != null)
>             exceptionHandler.accept(interruptedException);
>     }
>     finally {
>         return duration;
>     }
> }
>
> so I can write
>
> AtomicInteger value = new AtomicInteger();
> var lag = new Lag(minimumDuration, maximumDuration);
> Runnable task1 = () -> {
>     value.set(1);
>     lag.sleep(cause -> value.set(2));
>     if (value.get() == 1) value.set(3);
> };
>
> Runnable task2 = () -> {
>     for (int i = 0; i < 10; i++) {
>         if (Thread.interrupted()) break;
>         else lag.sleep();
>     }
> };
>
> Maybe not the best example in the world, because it's a unit test, but it
> can lead to less boilerplate. I have seen this pattern in other frameworks,
> but dealing with StructuredExecturor CompletionHandlers inspired me to use
> it in my own APIs. It would be nice to see this pattern adopted in other
> Java APIs. For example, I would like to be able to write
>
> Runnable task3 = () -> {
>     for (int i = 0; i < 10; i++) {
>         if (Thread.interrupted()) break;
>         else Thread.sleep(Duration.ofMillis(10), cause -> {});
>     }
> };
>
> Is there an existing JEP where I can make this feature request?
>
> Cheers, Eric
>


More information about the loom-dev mailing list