1
我有一组唯一值的 - ["A","B","C","D"]
多个线程试图从中删除值。 当它变为空时,代码应该通知一些监听者。
在Java中,我每次移除元素时都需要阻塞线程,并检查集合是否为空,以防止一次发送2个相同的事件。
那么我可以用RxJava以某种方式实现它而不阻止执行?
P.S.在真正的节目中有很多这样的组合。
我有一组唯一值的 - ["A","B","C","D"]
多个线程试图从中删除值。 当它变为空时,代码应该通知一些监听者。
在Java中,我每次移除元素时都需要阻塞线程,并检查集合是否为空,以防止一次发送2个相同的事件。
那么我可以用RxJava以某种方式实现它而不阻止执行?
P.S.在真正的节目中有很多这样的组合。
你的问题有点含糊,但听起来像你想要的东西是这样的:
final class RxSet {
final Set<String> elements = new HashSet<String>();
final AsyncSubject<Object> onEmpty = AsyncSubject.create();
public RxSet(String... initialValues) {
elements.addAll(Arrays.asList(initialValues));
}
public Observable<Object> onEmpty() {
return onEmpty;
}
public boolean take(String item) {
boolean wasEmpty = false;
boolean isEmpty = false;
boolean success = false;
synchronized (this) {
wasEmpty = set.isEmpty();
success = set.remove(item);
isEmpty = set.isEmpty();
}
if (!wasEmpty && isEmpty) {
onEmpty.onNext("became empty");
onEmpty.onComplete();
}
return success;
}
}
非常感谢。这是一个很好的解决方案 –
请张贴一些代码和打算,否则我们不能帮你。 RxJava是关于不变性和对事件基础变化的反应。我没有看到任何满足的要求。 –