首页 > 解决方案 > BufferedReader.lines() 方法在 Windows 上锁定

问题描述

我有调用 BufferedReader.lines() 的代码。

EIPLogManager2.getServerLogger().info("Got header row: " + headerRow); //TODO delete this

            List<String> allBatches = reader.lines()
                    .skip(forkCount > 0 ? forkCount * forkSize : 0)
                    .limit(transactionsRemaining.get() * forkSize)
                    .collect(Collectors.toList());

            EIPLogManager2.getServerLogger().info("Got all batches. Size: " + allBatches.size()); //TODO delete this

让我解释一下这段代码的行为:

  1. 在我的 Mac 上运行它。完美运行。

  2. 在 Windows 上运行它。标题行日志条目打印出来,但 Got all batches 日志条目永远不会。它似乎在流中冻结。

transactionsRemaining.get() 调用是针对 AtomicInteger。

我不知道为什么在 Windows 上会发生这种情况。这没有道理。我已经在 J​​RE 8 和 JRE 11 中看到了这种行为。

标签: java

解决方案


好吧,我傻了。因此 forkSize 和 transactionsRemaining 变量由用户输入设置。用户已将 transactionsRemaining 设置为 1,000,000,000,因此 limit() 的数学运算产生的值大于 Integer.MAX_VALUE。然后抛出了一个 IllegalArgumentException,我想我没有任何东西可以向我报告该异常。

现在问题已解决。


推荐阅读