Java 8 Java 8并行流+;anyMatch-一旦找到匹配,线程是否会被中断?

Java 8 Java 8并行流+;anyMatch-一旦找到匹配,线程是否会被中断?,java-8,Java 8,如果我在Java8中有一个并行流,并且以anyMatch终止,并且我的集合中有一个与谓词匹配的元素,那么我试图找出当一个线程处理这个元素时会发生什么 我知道anyMatch是短路,所以我不希望在处理匹配元素之后再处理其他元素。我的困惑是关于其他线程发生了什么,这大概是在处理元素的中间。我可以想到3种可能的情况: a) 他们被打断了吗? b) 他们是否继续处理他们正在处理的元素,然后,一旦所有线程都不做任何事情,我就会得到结果? c) 我是否得到了结果,但正在处理其他元素的线程继续处理这些元素(但

如果我在Java8中有一个并行流,并且以anyMatch终止,并且我的集合中有一个与谓词匹配的元素,那么我试图找出当一个线程处理这个元素时会发生什么

我知道anyMatch是短路,所以我不希望在处理匹配元素之后再处理其他元素。我的困惑是关于其他线程发生了什么,这大概是在处理元素的中间。我可以想到3种可能的情况: a) 他们被打断了吗? b) 他们是否继续处理他们正在处理的元素,然后,一旦所有线程都不做任何事情,我就会得到结果? c) 我是否得到了结果,但正在处理其他元素的线程继续处理这些元素(但在其他元素完成后不处理它们)

我有一个长时间运行的谓词,当我知道一个元素匹配时,快速终止是非常有用的。我有点担心,因为我在文档中找不到这方面的信息,这可能是一个依赖于实现的东西,知道这一点也很好


谢谢

在深入研究了Java源代码之后,我想我找到了答案

其他线程定期检查另一个线程是否找到了答案,如果找到了,则停止工作并取消所有尚未运行的节点

java.util.Stream.FindOps$FindTask
具有以下方法:

private void foundResult(O answer) {
        if (isLeftmostNode())
            shortCircuit(answer);
        else
            cancelLaterNodes();
    }
它的父类,
AbstractShortcircuitTask
实现
shortCircuit
如下:

 /**
 * Declares that a globally valid result has been found.  If another task has
 * not already found the answer, the result is installed in
 * {@code sharedResult}.  The {@code compute()} method will check
 * {@code sharedResult} before proceeding with computation, so this causes
 * the computation to terminate early.
 *
 * @param result the result found
 */
protected void shortCircuit(R result) {
    if (result != null)
        sharedResult.compareAndSet(null, result);
}
而实际的
compute()

 AtomicReference<R> sr = sharedResult;
    R result;
    while ((result = sr.get()) == null) {
        ...//does the actual fork stuff here
    }
AtomicReference sr=sharedResult;
R结果;
而((result=sr.get())==null){
…//这里实际的叉子是什么
}
其中,
sharedResult
shortCircuit()
方法更新,以便计算机在下次检查while循环条件时看到它

编辑 总而言之:

  • 线程不会中断
  • 相反,他们会定期检查是否有人找到了答案,如果找到了答案,他们会停止进一步的处理
  • 一旦找到答案,就不会启动新线程
    这是关于实现代码的非常详细的信息,但我建议添加一个总结,最终解决OP的问题,即“将会发生什么”→ <代码>b
  • 有人能澄清一下吗?这是否也适用于非匹配和所有匹配操作?所以,如果allMatch的线程发现一个不匹配的元素,其他线程是否会定期检查并因此停止?