Durations in existing JDK APIs

Stephen Colebourne scolebourne at joda.org
Sat Jun 16 09:33:04 UTC 2018


Without commenting on the proposed implementation below, Future seems like
a good place to start. I suspect that ExecutorService and
ScheduledExecutorService would also be good targets to enhance.
Stephen

On Fri, 15 Jun 2018, 18:43 Martin Buchholz, <martinrb at google.com> wrote:

>
>
> On Wed, May 30, 2018 at 11:32 AM, Doug Lea <dl at cs.oswego.edu> wrote:
>
>>
>> The original rationale for designing j.u.c.TimeUnit using the Flyweight
>> pattern was to to reduce allocation and GC-related overhead and timing
>> jitter for methods that otherwise may operate on the order of
>> nanoseconds. But there are many cases in which this is not much of a
>> concern (plus JVMs can now sometimes optimize), so people should be
>> given a choice. It would be a lot of tedious work (and aggregate code
>> bulk) to retrofit every time-related j.u.c method though, and it's not
>> clear where to compromise. But at least adding converters should not be
>> controversial.
>>
>
> Re-reading Doug's assessment, Doug seems reluctant but open to adding at
> least some Duration overloads.  Here's  an obvious first candidate in Future
> (yes, we have a test that discovers get(Duration) and checks that
> get(null) throws UOE instead of NPE.).
> (It's a lot of tedious work)
>
> a/util/concurrent/CompletableFuture.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/CompletableFuture.java,v
> retrieving revision 1.212
> diff -u -r1.212 CompletableFuture.java
> --- src/main/java/util/concurrent/CompletableFuture.java 11 Mar 2018
> 18:00:05 -0000 1.212
> +++ src/main/java/util/concurrent/CompletableFuture.java 15 Jun 2018
> 17:39:09 -0000
> @@ -1983,13 +1983,22 @@
>       * while waiting
>       * @throws TimeoutException if the wait timed out
>       */
> -    @SuppressWarnings("unchecked")
>      public T get(long timeout, TimeUnit unit)
>          throws InterruptedException, ExecutionException, TimeoutException
> {
> -        long nanos = unit.toNanos(timeout);
> +        return getNanos(unit.toNanos(timeout));
> +    }
> +
> +    public T get(java.time.Duration timeout)
> +        throws InterruptedException, ExecutionException, TimeoutException
> {
> +        return getNanos(TimeUnit.NANOSECONDS.convert(timeout));
> +    }
> +
> +    @SuppressWarnings("unchecked")
> +    private T getNanos(long timeoutNanos)
> +        throws InterruptedException, ExecutionException, TimeoutException
> {
>          Object r;
>          if ((r = result) == null)
> -            r = timedGet(nanos);
> +            r = timedGet(timeoutNanos);
>          return (T) reportGet(r);
>      }
>
> @@ -2797,6 +2806,8 @@
>              throw new UnsupportedOperationException(); }
>          @Override public T get(long timeout, TimeUnit unit) {
>              throw new UnsupportedOperationException(); }
> +        @Override public T get(java.time.Duration duration) {
> +            throw new UnsupportedOperationException(); }
>          @Override public T getNow(T valueIfAbsent) {
>              throw new UnsupportedOperationException(); }
>          @Override public T join() {
> Index: src/main/java/util/concurrent/Future.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/Future.java,v
> retrieving revision 1.41
> diff -u -r1.41 Future.java
> --- src/main/java/util/concurrent/Future.java 8 Oct 2016 18:52:37 -0000
> 1.41
> +++ src/main/java/util/concurrent/Future.java 15 Jun 2018 17:39:09 -0000
> @@ -6,6 +6,10 @@
>
>  package java.util.concurrent;
>
> +import static java.util.concurrent.TimeUnit.NANOSECONDS;
> +
> +import java.time.Duration;
> +
>  /**
>   * A {@code Future} represents the result of an asynchronous
>   * computation.  Methods are provided to check if the computation is
> @@ -126,7 +130,30 @@
>       * @throws InterruptedException if the current thread was interrupted
>       * while waiting
>       * @throws TimeoutException if the wait timed out
> +     * @throws NullPointerException if {@code unit} is null
>       */
>      V get(long timeout, TimeUnit unit)
>          throws InterruptedException, ExecutionException, TimeoutException;
> +
> +    /**
> +     * Waits if necessary for at most the given time for the computation
> +     * to complete, and then retrieves its result, if available.
> +     *
> +     * <p>Equivalent to: <pre> {@code
> +     * get(NANOSECONDS.convert(timeout), NANOSECONDS)}</pre>
> +     *
> +     * @param timeout the maximum time to wait
> +     * @return the computed result
> +     * @throws CancellationException if the computation was cancelled
> +     * @throws ExecutionException if the computation threw an
> +     * exception
> +     * @throws InterruptedException if the current thread was interrupted
> +     * while waiting
> +     * @throws TimeoutException if the wait timed out
> +     * @throws NullPointerException if {@code timeout} is null
> +     */
> +    default V get(Duration timeout)
> +        throws InterruptedException, ExecutionException, TimeoutException
> {
> +        return get(NANOSECONDS.convert(timeout), NANOSECONDS);
> +    }
>  }
>
>


More information about the core-libs-dev mailing list