Java流中的阻塞

时间:2019-07-15 21:46:25

标签: java java-stream

是否有一种方法可以制作一个Stream块并等待数据源中的数据准备好,然后在我知道没有其他要等待的时候关闭它?我已经尝试使数据源成为一个像created_at_modified 2019-06-30 16:45:04.000 这样的阻塞源,但是由于我使用BlockingQueue而不是forEeachtake在流上循环,因此它显然无法正常工作阻止功能。

2 个答案:

答案 0 :(得分:2)

围绕Spliterator设计流是其元素的最终来源。您可以实现tryAdvance()方法来测试是否存在另一个元素,直到知道结果为止都进行阻塞。

您提到了BlockingQueue,它在并发处理中很有用。如果要在某些线程中“生成”元素,并尝试在其他线程中“使用”元素,则可能会发现CompletionService比自定义Stream更适合您的应用程序。

Spliterator就其操作而言是一个非常简单的界面,但是正确实现它需要对spliterator "characteristics".有一个很好的理解,我认为这是一个高级主题,并且在某些情况下,自定义实现很有用,也可能是一个警告信号,表明您使用的方法不正确-您不必对所有内容都使用Stream

(用StreamSupport.stream()Stream创建Spliterator。)

答案 1 :(得分:0)

我想这应该起作用:

BlockingQueue<T> queue = ...; // Signal with a null sentinel.
Iterable<T> collection = () -> new Iterator<T>() {
    private boolean hasCurrent;
    private T current;
    public boolean hasNext() {
        if (!hasCurrent) {
            current = queue.take();
            hasCurrent = true;
        }
        return current != null;
    }
    public T next() {
        if (hasCurrent) {
            hasCurrent = false;
            return current;
        } else {
            return queue.take();
        }
    }
};
StreamSupport.stream(collection.spliterator(), false)...

可能还有更好的方法。