任务:
我有一组独特的价值观 - ["A","B","C","D"]
多个线程正在尝试从中删除值。
当它变空时,代码应该通知一些听众。
在Java中,每次删除元素时都需要阻塞线程,并检查集合是否为空,以防止一次发送2个相同的事件。
那么我可以用RxJava以某种方式实现它而不会阻塞执行吗?
P.S。在实际程序中有很多这样的设置。
答案 0 :(得分:1)
你的问题有点模糊,但听起来你想要这样的东西:
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;
}
}