
io.github.vipcxj.jasync.ng.runtime.schedule.RacePromiseTask Maven / Gradle / Ivy
package io.github.vipcxj.jasync.ng.runtime.schedule;
import io.github.vipcxj.jasync.ng.spec.JContext;
import io.github.vipcxj.jasync.ng.spec.JPromise;
import io.github.vipcxj.jasync.ng.spec.JThunk;
import java.util.List;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
public class RacePromiseTask implements Task {
private final List> promises;
/**
* 0: init state;
* 1: resolved;
* -1: rejected;
*/
private volatile int state;
@SuppressWarnings("rawtypes")
private final static AtomicIntegerFieldUpdater STATE_UPDATER = AtomicIntegerFieldUpdater.newUpdater(RacePromiseTask.class, "state");
public RacePromiseTask(List> promises) {
this.promises = promises;
this.state = 0;
}
@Override
public void schedule(JThunk thunk, JContext context) {
for (JPromise extends T> promise : promises) {
promise.onSuccess((v, ctx) -> {
if (STATE_UPDATER.compareAndSet(this, 0, 1)) {
thunk.resolve(v, context);
for (JPromise extends T> promise1 : promises) {
if (promise1 != promise) {
promise1.cancel();
}
}
}
}).onError((error, ctx) -> {
if (STATE_UPDATER.compareAndSet(this, 0, -1)) {
thunk.reject(error, context);
for (JPromise extends T> promise1 : promises) {
if (promise1 != promise) {
promise1.cancel();
}
}
}
}).async(context.fork());
}
}
@Override
public void cancel() {
for (JPromise extends T> promise : promises) {
promise.cancel();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy