当前位置: 首页 > 知识库问答 >
问题:

Java8Parallel stream+anyMatch-线程一旦找到匹配就会中断吗?

松亦
2023-03-14

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

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

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

谢谢

共有1个答案

司空繁
2023-03-14

在仔细研究了Java源代码之后,我想我找到了答案。

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

java.util.stream.findops$FindTask具有以下方法:

private void foundResult(O answer) {
        if (isLeftmostNode())
            shortCircuit(answer);
        else
            cancelLaterNodes();
    }
 /**
 * 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);
}
 AtomicReference<R> sr = sharedResult;
    R result;
    while ((result = sr.get()) == null) {
        ...//does the actual fork stuff here
    }
  1. 线程不中断
  2. 相反,他们将定期检查是否有人找到了答案,如果找到了答案,将停止进一步的处理。
  3. 一旦找到答案,将不会启动任何新线程。
 类似资料:
  • 问题内容: 我需要制作一个具有同步和异步功能的库。 -等到得到结果,然后返回结果。 -立即返回Future,如果需要,可以在完成其他操作后进行处理。 我图书馆的核心逻辑 客户将使用我们的库,他们将通过传递构建器对象来调用它。然后,我们将使用该对象构造一个URL,并通过执行该对象来对该URL进行HTTP客户端调用,并在将响应作为JSON字符串返回给我们之后,通过创建对象将该JSON字符串发送回给我们

  • 一旦找到匹配项(在本例中为16),不会立即返回,而是阻塞,直到剩余的线程完成。在这种情况下,调用方在找到匹配项后返回之前将额外等待5秒。

  • 问题内容: 我有以下代码利用多处理程序来遍历大列表并找到匹配项。在任何一个进程中找到匹配项后,如何使所有进程停止?我已经看到了一些示例,但是我似乎都不适合我在这里所做的事情。 谢谢你的时间。 更新1: 我已经实现了@ShadowRanger的出色方法中建议的更改,并且几乎可以按照我想要的方式工作。因此,我添加了一些日志记录以指示进度,并在其中放置一个“测试”键以进行匹配。我希望能够独立于num_p

  • 问题内容: 我有这个线程可以从服务器下载一些图像。因此,一旦下载了图像,我就调用处理程序并进行UI更新。因此,由于不建议使用stop()线程,因此无法使用它。我在这里有两个问题。 最终该线程会发生什么?(意味着我调用处理程序方法后会发生什么)。 或者如何不使用stop()停止该线程? 这是我的代码。 问题答案: 线程将结束并自行死亡。您不必自己结束。如果不创建新对象,将无法重新启动它。垃圾收集器将

  • 我有一个单独的thread类,下面是run方法, 如果我输入数字,程序工作正常。当我输入一个字符时,它会转到catch块,并按预期执行其中的行。一旦catch块的执行完成,它将再次迭代并请求键盘输入。但是当我试图输入一个值(一个数字或一个字符)时,它不会读取任何内容,而是一直等待,而不执行下一行。我想做的是,要求用户输入一个数字,如果用户输入一个字符,在控制台中打印一条错误消息,并再次迭代whil

  • 所以我试图修改我的控制器类中的一些圆,我已经将这些圆链接到我的fxml文件圆,但是当我试图将它们添加到圆数组中以便于管理时,它们似乎失去了它们的引用。例如,我有: 上述方法成功地在给定坐标中弹出一个圆。但是,以下方法不起作用: 这不管用!尝试了数组尝试了数组列表尝试了Linkedlist,对Circle1的引用丢失了。我是JAVAFX的新手,所以这可能是一个简单的修复,但我试着研究了一点,尝试了不