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