All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 promise : promises) {
            promise.onSuccess((v, ctx) -> {
                if (STATE_UPDATER.compareAndSet(this, 0, 1)) {
                    thunk.resolve(v, context);
                    for (JPromise promise1 : promises) {
                        if (promise1 != promise) {
                            promise1.cancel();
                        }
                    }
                }
            }).onError((error, ctx) -> {
                if (STATE_UPDATER.compareAndSet(this, 0, -1)) {
                    thunk.reject(error, context);
                    for (JPromise promise1 : promises) {
                        if (promise1 != promise) {
                            promise1.cancel();
                        }
                    }
                }
            }).async(context.fork());
        }
    }

    @Override
    public void cancel() {
        for (JPromise promise : promises) {
            promise.cancel();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy