<div dir="ltr"><div><div class="gmail_extra"><div>Sorry for hijacking this thread. But if additional functionality for CompletableFuture is on the table. I have a couple of requests, some of them just syntactically sugar.</div>
<div><br></div><div>1)</div><div>A simple way to create an immutable CompletionStage from a CompletionFuture.</div><div>Right now if I have something like like this </div><div>class ProvidedToUsers {</div><div>    CompletionFuture f;</div>
<div>    CompletionStage doAsyncStuff() {</div><div>        return f;</div><div>    }</div><div>}</div><div>Any client can just do:</div><div>xx.doAsyncStuff().toCompletionFuture().cancel();</div><div><br></div><div>Right now I'm using this to make an "immutable" future:</div>
<div><br></div><div>CompletableFuture<Void> cf = new CompletableFuture<>();</div><div>f.handle((a, b) -> {</div><div>    if (b == null) {</div><div>        cf.complete(null);</div><div>    } else {</div><div>
        cf.completeExceptionally(b);</div><div>    }</div><div>    return null;</div><div>});</div><div>return cf;</div><div><br></div><div><br></div><div>2)</div><div>An easy way to create a CompletableFuture that is exceptionally completed:</div>
<div><br></div><div>return CompletableFuture.completedExceptionally(throwable);</div><div><br></div><div>is better than:</div><div><br></div><div>CompletableFuture<T> cf = new CompletableFuture<>();</div><div>
cf.completeExceptionally(throwable);</div><div>return cf;</div><div><br></div><div>3)</div><div>An easy way to get the exceptional cause from a CompletableFuture, right now I'm using this</div><div><br></div><div>if (cf.isCompletedExceptionally()) {</div>
<div>    try {</div><div>        cf.getNow(null);</div><div>    } catch (CancellationException e) {</div><div>        return e;</div><div>    } catch (CompletionException e) {</div><div>        return e.getCause();</div><div>
    }</div><div>}</div><div>return null;    </div><div><br></div><div>4)</div><div>With regards to async-io completions I'm using the following piece of code to make completable futures that timeout at some point.</div>
<div><br></div><div>public static <T> CompletableFuture<T> timeout(CompletableFuture<T> delegate, ScheduledExecutorService ses,</div><div>        long timeout, TimeUnit unit) {</div><div>    CompletableFuture<T> cf = new CompletableFuture<>();</div>
<div>    Future<?> f;</div><div>    try {</div><div>        f = ses.schedule(new Runnable() {</div><div>            public void run() {</div><div>                if (!delegate.isDone()) {</div><div>                    cf.completeExceptionally(new TimeoutException("Timed out after " + timeout + " "</div>
<div>                            + unit.toString().toLowerCase()));</div><div>                }</div><div>            }</div><div>        }, timeout, unit);</div><div>    } catch (RejectedExecutionException e) {</div><div>
        // Unfortunately TimeoutException does not allow exceptions in its constructor</div><div>        cf.completeExceptionally(new RuntimeException("Could not schedule timeout task, ", e));</div><div>        return cf;</div>
<div>    }</div><div>    delegate.handle(new BiFunction<T, Throwable, Void>() {</div><div>        public Void apply(T t, Throwable throwable) {</div><div>            // Users must manually purge if many outstanding tasks</div>
<div>            f.cancel(false);</div><div>            if (throwable != null) {</div><div>                cf.completeExceptionally(throwable);</div><div>            } else {</div><div>                cf.complete(t);</div>
<div>            }</div><div>            return null;</div><div>        }</div><div>    });</div><div>    return cf;</div><div>}</div><div><br></div><div>Something similar might be nice to add to CompletableFuture.</div><div>
<br></div><div>5)</div><div>Not related to CompletableFuture, but could CancellationException and TimeoutException get constructors that also takes a</div><div>Throwable.</div><div><br></div><div>Cheers</div><div>  Kasper</div>
<br><div class="gmail_quote">On Sat, Aug 30, 2014 at 4:51 PM, Doug Lea <span dir="ltr"><<a href="mailto:dl@cs.oswego.edu" target="_blank">dl@cs.oswego.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
It is easy to define utilities automating common use cases, including<br>
simple periodic suppliers (via a common ScheduledExecutor), and<br>
async-io completions (via adaptors from nio CompletionHandler).<br><span><font color="#888888"><br>
-Doug</font></span><div><div><br>
______________________________<u></u>_________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.<u></u>oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/<u></u>listinfo/concurrency-interest</a><br>
</div></div></blockquote></div><br></div></div></div>