2016-11-10 50 views
1

任务:RxJava解决方案,以防止堵塞在多线程环境

我有一组唯一值的 - ["A","B","C","D"] 多个线程试图从中删除值。 当它变为空时,代码应该通知一些监听者。

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

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

P.S.在真正的节目中有很多这样的组合。

+0

请张贴一些代码和打算,否则我们不能帮你。 RxJava是关于不变性和对事件基础变化的反应。我没有看到任何满足的要求。 –

回答

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; 
    } 
} 
+0

非常感谢。这是一个很好的解决方案 –