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