RFR 8005696: Add CompletableFuture - JEP 155
Chris Hegarty
chris.hegarty at oracle.com
Thu Apr 4 15:36:52 UTC 2013
This is finally ready for integration. Going once... going twice...
Updated webrev and specdiff:
http://cr.openjdk.java.net/~chegar/8005696/ver.02/
Doug,
I just finalized the jtreg test, and found a small issue. Please find
below a suggested change (included in the webrev), and a small test to
demonstrate. Since the jtreg test reproduces the problem, the small test
is just for your convenience to validate the change, etc.
>: cvs diff -u -U5 CompletableFuture.java
Index: CompletableFuture.java
===================================================================
RCS file:
/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/CompletableFuture.java,v
retrieving revision 1.80
diff -u -U 5 -r1.80 CompletableFuture.java
--- CompletableFuture.java 1 Apr 2013 20:16:05 -0000 1.80
+++ CompletableFuture.java 4 Apr 2013 13:34:58 -0000
@@ -2812,12 +2812,15 @@
}
if (dst == null)
dst = new CompletableFuture<U>();
}
}
- if (e == null && ex != null)
+ if (ex != null) {
+ if (dst == null)
+ dst = new CompletableFuture<U>();
dst.internalComplete(null, ex);
+ }
}
helpPostComplete();
dst.helpPostComplete();
return dst;
}
Here is a test to reproduce:
:> cat ThenCompose.java
import java.util.concurrent.CompletableFuture;
public class ThenCompose {
public static void main(String[] args) throws Exception {
CompletableFuture<?> cf1 = CompletableFuture.supplyAsync(() ->
{ throw new RuntimeException(); });
CompletableFuture<Void> cf2 = cf1.thenCompose((x) ->
{ return new
CompletableFuture<Void>(); });
}
}
:>
/export/home/chris/repos/jdk8/tl/cf/build/solaris-sparc-normal-server-release/jdk/bin/java
ThenCompose
Exception in thread "main" java.lang.NullPointerException
at
java.util.concurrent.CompletableFuture.doCompose(CompletableFuture.java:2847)
at
java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2756)
at ThenCompose.main(ThenCompose.java:8)
lection
-Chris.
On 03/27/2013 07:46 PM, Doug Lea wrote:
> On 03/23/13 07:08, Doug Lea wrote:
>>
>> There was a signature mismatch between the public
>> public static CompletableFuture<Void> anyOf(CompletableFuture<?>...
>> cfs)
>> and the internal method performing most of the work:
>> private static CompletableFuture<?> anyTree(...)
>> ("<Void>" and "<?>" are subtly different.)
>
> Thanks to Martin especially for knocking some sense into me
> about this. The type signature *was* incompatible, but
> changing to <Void> rather the <Object> made this updated
> version less useful (it could only return indication, not
> result). So it is now updated with a signature-correct
> version of anyOf with its original semantics.
>
> Additionally, while being slightly disruptive anyway:
> This class was lacking a little convenience method found in
> other Future-based frameworks that surely will be requested.
> So now added:
>
> /**
> * Returns a new CompletableFuture that is already completed with
> * the given value.
> *
> * @param value the value
> * @return the completed CompletableFuture
> */
> public static <U> CompletableFuture<U> completedFuture(U value)
More information about the core-libs-dev
mailing list