RxJava服务器实现
在阅读David Karnok关于RxJava内部构件的文章时,我遇到了一个实现类似RxJava的RxJava服务器实现,java,concurrency,rx-java,Java,Concurrency,Rx Java,在阅读David Karnok关于RxJava内部构件的文章时,我遇到了一个实现类似RxJava的SerializedObjectServer类的示例。代码如下: class ValueListEmitterLoop<T> { List<T> queue; boolean emitting; Consumer<? super T> consumer; public void
SerializedObjectServer
类的示例。代码如下:
class ValueListEmitterLoop<T> {
List<T> queue;
boolean emitting;
Consumer<? super T> consumer;
public void emit(T value) {
synchronized (this) {
if (emitting) {
List<T> q = queue;
if (q == null) {
q = new ArrayList<>();
queue = q;
}
q.add(value);
return;
}
emitting = true;
}
consumer.accept(value);
for (;;) {
List<T> q;
synchronized (this) {
q = queue;
if (q == null) {
emitting = false;
return;
}
queue = null;
}
q.forEach(consumer);
}
}
}
我发现将字段读入局部变量是一种很好的做法,特别是当它们被多次使用并且附近有一些易失性/同步访问时 例如,以下是一种常见模式:
volatile boolean cancelled;
final Queue<T> queue;
final Subscriber<? super T> actual;
void drain() {
Subscriber<? super T> a = actual;
Queue<T> q = queue;
for (;;) {
if (cancelled) {
return;
}
T v = q.poll();
if (v == null) {
a.onComplete();
return;
}
a.onNext(v);
}
}
volatile布尔取消;
最终队列;
最后感谢你!我希望你能回答。
volatile boolean cancelled;
final Queue<T> queue;
final Subscriber<? super T> actual;
void drain() {
Subscriber<? super T> a = actual;
Queue<T> q = queue;
for (;;) {
if (cancelled) {
return;
}
T v = q.poll();
if (v == null) {
a.onComplete();
return;
}
a.onNext(v);
}
}