JVM Stream API RollBack

Has*_*hra 0 java java-8

当我们向流API提供一些输入时,它将其分成块,JVM创建多个线程以在该块上执行执行.

题 :-

如果我给出了数百万个条目ArrayList作为并行管道的输入,并且在List by JVM上的计算的前半部分之后发生内部线程异常.

JVM如何处理ROll Back.

JVM真的回滚到了原始状态吗?

Hol*_*ger 5

没有回滚的东西,在正常情况下,没有必要这样做.流操作正在从源读取生成新结果.在异常的情况下,没有新结果,并且在处理期间创建的任何临时对象最终将被垃圾收集.

在一个完美的世界中,终端操作会在将异常转发给调用者之前等待所有子任务的完成,但是目前它还没有,请参阅此问答.但即使它确实如此,子任务继续处理项目,直到他们的工作量结束或检测到操作已中止,而不是回滚他们以前的工作.

请注意,文档明确不鼓励使用具有有状态行为的函数,因为在使用并行流时结果可能是不确定的或不正确的.即使没有例外,并行流也可以处理在执行短路操作时对最终结果没有贡献的元素.在任何一种情况下,功能产生的副作用都不能回滚.

必须强调的是,这也适用于副作用的合法使用,即使用peekforEach在特殊情况下不会撤消其行为.如果您peek出于预期目的使用,那么这不是问题,因为报告元素已被处理仍然是正确的,即使结果因后续异常而被删除.如果这是你的行动传递到一个问题forEach,因为你不希望他们发生在特殊情况下,有没有办法解决第1集合中的元素,例如通过toArraycollect(toList()),并做了forEach之后流操作的结果正常完成.

当然,如果动作只修改具有自己的回滚机制的某些事物的状态,例如将每个元素发送到数据库,则不需要这样做.

对于一些情况下,读取操作的流当修改源,例如状态从一个随机数发生器读取的数字,从线BufferedReader,或从一个令牌Scanner(爪哇9) .在这些情况下,操作也会对无法撤消的源产生影响.

在的情况下,BufferedReader.lines()Scanner.tokens(),文件明确指出,阅读器/扫描仪是在手术后未指定状态,即使在非特殊情况下,以及Random数发生器通常喜欢反正生产不可预知的数字处理.因此,对于这些情况都没有,没有回滚会导致问题.