gpt4 book ai didi

java - 在主线程中运行 Flow

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:57 26 4
gpt4 key购买 nike

我再次将 RxJava 与 Java 9 Flow 进行比较。我看到默认情况下 Flow 是异步的,我想知道是否有办法让它同步运行。

有时我们只想将它用于糖语法而不是用于 Nio,并拥有更同质的代码。

在 RxJava 中,默认情况下它是同步的,您可以在管道中使用 observerOnsubscribeOn 使其异步运行。

Flow 中是否有任何运算符使其在主线程中运行?

问候。

最佳答案

您可以按照 Flow 中的说明定义您的自定义 Publisher 用于使用同步执行。

A very simple publisher that only issues (when requested) a single TRUE item to a single subscriber. Because the subscriber receives only a single item, this class does not use buffering and ordering control.

class OneShotPublisher implements Publisher<Boolean> {
private final ExecutorService executor = ForkJoinPool.commonPool(); // daemon-based
private boolean subscribed; // true after first subscribe
public synchronized void subscribe(Subscriber<? super Boolean> subscriber) {
if (subscribed)
subscriber.onError(new IllegalStateException()); // only one allowed
else {
subscribed = true;
subscriber.onSubscribe(new OneShotSubscription(subscriber, executor));
}
}
static class OneShotSubscription implements Subscription {
private final Subscriber<? super Boolean> subscriber;
private final ExecutorService executor;
private Future<?> future; // to allow cancellation
private boolean completed;
OneShotSubscription(Subscriber<? super Boolean> subscriber,
ExecutorService executor) {
this.subscriber = subscriber;
this.executor = executor;
}
public synchronized void request(long n) {
if (n != 0 && !completed) {
completed = true;
if (n < 0) {
IllegalArgumentException ex = new IllegalArgumentException();
executor.execute(() -> subscriber.onError(ex));
} else {
future = executor.submit(() -> {
subscriber.onNext(Boolean.TRUE);
subscriber.onComplete();
});
}
}
}
public synchronized void cancel() {
completed = true;
if (future != null) future.cancel(false);
}
}
}

关于java - 在主线程中运行 Flow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46506026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com