Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Villiger2019-08-26 09:29:09 +0000
committerMatthias Villiger2019-08-26 09:29:09 +0000
commitb9d1080bcbac032dd92e50d5a4bcecdc9ae6542a (patch)
tree5df12f118fd404ead469f851be67f75bbccf20a4 /org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java
parentfa72e93b20459e9622d4d09aad443be664ba25eb (diff)
downloadorg.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.tar.gz
org.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.tar.xz
org.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.zip
IFuture result computation should be lazy
The result computation of IFutures should only be performed if the client requests the result. If it just waits for the computation to complete, the result must not be computed. Therefore the result is always of type Supplier so that the computation of the supplier value is only performed on request and only once.
Diffstat (limited to 'org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java')
-rw-r--r--org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java14
1 files changed, 8 insertions, 6 deletions
diff --git a/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java b/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java
index 605b7dcb7..ffd1197db 100644
--- a/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java
+++ b/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java
@@ -16,13 +16,14 @@ import java.util.concurrent.CompletionException;
import java.util.function.Supplier;
import org.eclipse.scout.sdk.core.log.SdkLog;
+import org.eclipse.scout.sdk.core.util.FinalValue;
/**
* <h3>{@link Future}</h3>
*
* @since 7.1.0
*/
-public class Future<V> extends CompletableFuture<V> implements IFuture<V> {
+public class Future<V> extends CompletableFuture<Supplier<V>> implements IFuture<V> {
/**
* Creates a completed {@link IFuture} with the specified result.
@@ -93,10 +94,10 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> {
@Override
public Future<V> awaitDoneThrowingOnError() {
try {
- result();
+ join();
}
catch (CancellationException e) {
- SdkLog.debug("Canellation silently ignored", e);
+ SdkLog.debug("Cancellation silently ignored", e);
}
return this;
}
@@ -108,10 +109,11 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> {
else {
if (error == null) {
if (resultExtractor == null) {
- complete(null);
+ complete(() -> null); // the supplier should never be null. only the result provided by the supplier may be null
}
else {
- complete(resultExtractor.get());
+ FinalValue<V> cachedResult = new FinalValue<>();
+ complete(() -> cachedResult.computeIfAbsentAndGet(resultExtractor));
}
}
else {
@@ -124,7 +126,7 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> {
@Override
public V result() {
try {
- return join();
+ return join().get();
}
catch (CompletionException e) {
SdkLog.debug("Future completed with errors.", e);

Back to the top