25
25
import java .util .concurrent .CompletableFuture ;
26
26
import java .util .concurrent .CompletionException ;
27
27
import java .util .concurrent .ExecutionException ;
28
+ import java .util .concurrent .Executor ;
28
29
import java .util .function .BiConsumer ;
29
30
import java .util .function .BiFunction ;
30
31
import java .util .function .Consumer ;
34
35
class DefaultPromise <T > implements Promise <T > {
35
36
36
37
private final CompletableFuture <T > future ;
38
+ private final Executor executor ;
37
39
38
40
DefaultPromise (CompletableFuture <T > future ) {
41
+ this (future , future .defaultExecutor ());
42
+ }
43
+
44
+ DefaultPromise (CompletableFuture <T > future , Executor executor ) {
39
45
this .future = future ;
46
+ this .executor = executor ;
40
47
}
41
48
42
49
@ Override
43
50
public Promise <T > onSuccess (Consumer <? super T > fn ) {
44
- return new DefaultPromise <>(future .whenCompleteAsync ((r , e ) -> { if (e == null ) fn .accept (r ); }) );
51
+ return new DefaultPromise <>(future .whenCompleteAsync ((r , e ) -> { if (e == null ) fn .accept (r ); }, executor ), executor );
45
52
}
46
53
47
54
@ Override
48
55
public <R > Promise <R > then (Function <? super T , R > fn ) {
49
- return new DefaultPromise <>(future .thenApplyAsync (fn ) );
56
+ return new DefaultPromise <>(future .thenApplyAsync (fn , executor ), executor );
50
57
}
51
58
52
59
@ Override
@@ -56,23 +63,23 @@ public <R> R fold(Function<? super T, R> success, Function<? super Exception, R>
56
63
return failure .apply ((Exception ) e );
57
64
else
58
65
return success .apply (r );
59
- }) ).join ().unsafe ();
66
+ }, executor ), executor ).join ().unsafe ();
60
67
61
68
}
62
69
63
70
@ Override
64
71
public <R > Promise <R > bind (Function <? super T , Promise <R >> fn ) {
65
- return new DefaultPromise <>(future .thenComposeAsync (t -> fn .apply (t ).future ()) );
72
+ return new DefaultPromise <>(future .thenComposeAsync (t -> fn .apply (t ).future (), executor ), executor );
66
73
}
67
74
68
75
@ Override
69
76
public <T2 , R > Promise <R > zip (Promise <T2 > other , BiFunction <? super T , ? super T2 , R > fn ) {
70
- return new DefaultPromise <>(future .thenCombineAsync (other .future (), fn ) );
77
+ return new DefaultPromise <>(future .thenCombineAsync (other .future (), fn , executor ), executor );
71
78
}
72
79
73
80
@ Override
74
81
public Promise <T > recover (Function <? super Exception , T > fn ) {
75
- return new DefaultPromise <>(future .exceptionally (t -> fn .apply ((Exception ) t )));
82
+ return new DefaultPromise <>(future .exceptionally (t -> fn .apply ((Exception ) t )), executor );
76
83
}
77
84
78
85
@ Override
@@ -83,7 +90,7 @@ public <Err extends Exception> Promise<T> recover(Class<? extends Err> expected,
83
90
return fn .apply (expected .cast (cause ));
84
91
else
85
92
return r ;
86
- }) );
93
+ }, executor ), executor );
87
94
}
88
95
89
96
@ Override
@@ -94,7 +101,7 @@ public Promise<T> recover(Predicate<? super Exception> p, Function<? super Excep
94
101
return fn .apply (cause );
95
102
else
96
103
return r ;
97
- }) );
104
+ }, executor ), executor );
98
105
}
99
106
100
107
@ Override
@@ -105,7 +112,7 @@ public <Err extends Exception> Promise<T> failure(Function<? super Exception, Er
105
112
throw failure (fn .apply (cause ));
106
113
else
107
114
return r ;
108
- }) );
115
+ }, executor ), executor );
109
116
}
110
117
111
118
@ Override
@@ -114,7 +121,7 @@ public Promise<T> onFailure(Consumer<? super Exception> fn) {
114
121
Exception cause = deep (e );
115
122
if (cause != null )
116
123
fn .accept (cause );
117
- }) );
124
+ }, executor ), executor );
118
125
}
119
126
120
127
private RuntimeException failure (Exception e ) {
@@ -141,6 +148,6 @@ public CompletableFuture<T> future() {
141
148
public Promise <T > subscribe (Subscriber <? super T > subscriber ) {
142
149
BiConsumer <T , Throwable > handle = (r , e ) -> { if (e == null ) subscriber .success (r ); else subscriber .failure ((Exception ) e ); };
143
150
BiConsumer <T , Throwable > done = (r , e ) -> subscriber .done ();
144
- return new DefaultPromise <>(future .whenCompleteAsync (handle ).whenCompleteAsync (done ) );
151
+ return new DefaultPromise <>(future .whenCompleteAsync (handle , executor ).whenCompleteAsync (done , executor ), executor );
145
152
}
146
153
}
0 commit comments