RxJava解决方案可防止多线程环境中的阻塞

时间:2016-11-10 15:22:31

标签: rx-java

任务:

我有一组独特的价值观 - ["A","B","C","D"] 多个线程正在尝试从中删除值。 当它变空时,代码应该通知一些听众。

在Java中,每次删除元素时都需要阻塞线程,并检查集合是否为空,以防止一次发送2个相同的事件。

那么我可以用RxJava以某种方式实现它而不会阻塞执行吗?

P.S。在实际程序中有很多这样的设置。

1 个答案:

答案 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;
    }
}