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

规范是否保证对顺序Java流的操作必须留在当前线程中?

祝俊雄
2023-03-14

规范是否保证,对顺序Java流的所有操作都在当前线程中执行?(“Foreach”及“ForeachOrdered”除外)

我明确要求规范,而不是当前实现做什么。我可以自己研究当前的实现,不需要麻烦您。但是实现可能会改变,而且还有其他实现。

我之所以这么问是因为ThreadLocals:我使用一个内部使用ThreadLocals的框架。即使像company.getName()这样的简单调用最终也会使用ThreadLocal。我不能改变这个框架的设计方式。至少在合理的时间内不会。

这里的规范似乎很混乱。包“java.util.Stream”的文档说明:

如果每个流操作都可能发生在一个未指定的线程中,那么该语句将是多余的。因此,是否相反:串行流上的所有操作都保证在当前线程中执行,除了“foreach”和“foreachordered”?

我在谷歌上搜索了关于“Java”、“Stream”和“ThreadLocal”组合的权威答案,但一无所获。关闭的东西是Brian Goetz对堆栈溢出的一个相关问题的回答,但它是关于顺序的,而不是线程,它只是关于“foreach”,而不是其他流方法:stream.foreach尊重序列流的相遇顺序吗?

共有1个答案

穆博简
2023-03-14

我相信您正在寻找的答案并不是很明确,因为它将取决于消费者和/或拆分者及其特征:

在阅读主要引文之前:

https://docs.oracle.com/javase/8/docs/api/java/util/collection.html#流

尽管拆分器在并行算法中有明显的用处,但它们并不是线程安全的;相反,使用拆分器的并行算法实现应该确保一次只由一个线程使用拆分器。这通常很容易通过串行线程约束来实现,而串行线程约束通常是通过递归分解工作的典型并行算法的自然结果。调用trySplit()的线程可以将返回的拆分器移交给另一个线程,而另一个线程可以遍历或进一步拆分该拆分器。如果两个或多个线程在同一拆分器上并发操作,拆分和遍历的行为是未定义的。如果原始线程将一个拆分器交给另一个线程处理,最好在tryAdvance()使用任何元素之前进行切换,因为某些保证(例如estimateSize()对大小拆分器的准确性)只有在遍历开始之前才有效。

拆分者和消费者有他们的一组特征,这将定义保证。让我们假设您在一条街中操作。由于拆分器不应该是线程安全的,并且应该处理可能在其他线程中的其他拆分器的元素,不管是否是序列的,所以保证是空的。但是,如果没有拆分occor引号将导致以下情况:在一个拆分器下,操作将保持在同一线程中,任何导致拆分的事件都将导致假设为null,否则为true

 类似资料:
  • 是否有任何保证在顺序和有序流上的操作是按遇到顺序处理的? 我是说,如果我有这样的代码: 是否可以保证它将按照生成范围的遇到顺序执行myFunction()调用? 我找到了Stream类的JavaDocs草案,它明确地说明了以下内容: 对于顺序流管道,如果管道源具有已定义的遇到顺序,则所有操作都按照管道源的遇到顺序执行。 但是它没有提到顺序流,这个例子是针对并行流的(我的理解是,顺序流和并行流都是正

  • 问题内容: 我特别想知道PostgreSQL。给出以下人为的示例: 从外部查询返回的名称是否保证与内部查询的顺序相同? 问题答案: 不,在外部查询中按以下顺序排序: 内部(子)查询返回结果集。如果按此顺序进行排序,则保证从内部(子)查询传递到外部查询的中间结果集将按照您指定的方式进行排序,但是在外部查询中不对结果进行排序通过处理内部查询结果集生成的结果集,不能保证以任何方式进行排序。

  • 问题内容: Java的foreach循环是否从第一个对象开始,并且以线性方式工作到结束?例如 是否总是先处理字符串“ Zoe”,然后处理“ Bob”等?没有排序发生?我已经对它进行了测试,但没有找到任何东西,但是我需要保证,在文档中找不到任何东西。 问题答案: 是。顺序不变。这适用于Java类集合框架的所有类型的集合,这些集合实现由for循环使用的迭代器接口。如果要对数组进行排序,则可以使用Arr

  • 问题内容: 我正在创建一个JavaScript对象,如下所示 之后,我将它们如下 上面的方法是否按照对象先前的顺序对它们进行了字符串化处理?字符串化后,它们将按照以前的顺序排列为0,1,2 .... 9吗? 问题答案: 文档中没有任何内容可以明确确认数组项的顺序已保留。但是,文档指出,对于非数组属性,不能保证顺序: 非数组对象的属性不能保证以任何特定顺序进行字符串化。不要依赖于字符串化中同一对象内

  • 问题内容: TL; DR; 我正在寻找一个可以查找特定中间操作或终端操作的地方。在哪里可以找到此类文档? 编辑 这不是如何确保java8流中的处理顺序的重复项?,因为该问题未提供完整的操作列表。 该软件包的文件说: 流是否具有遇到顺序取决于源和中间操作 为了确保在整个流操作中维持顺序,您必须研究流源,所有中间操作和终端操作的文档,以了解它们是否维持顺序(或源是否在第一个顺序中具有顺序)地点)。 一

  • 问题内容: 如果我创建这样的对象: 生成的对象会 总是 这样吗? 也就是说,属性的顺序是否与我添加它们的顺序相同? 问题答案: 自ES2015起,对象的迭代顺序遵循一组特定的规则,但不(始终)遵循插入顺序。简而言之,迭代顺序是字符串键的插入顺序和数字键的升序的组合: 使用数组或Map对象可能是实现此目的的更好方法。Map与密钥共享一些相似之处Object并保证密钥按插入顺序进行迭代,无一例外: M