或者,当所有注册方到达当前阶段时,我们可以通过重写`onAdvance()`方法`onAdvance(int phase, int registeredParties)`来运行特定操作。如果要触发`Phaser`的终止,则此方法返回一个`boolean`值,即`true`。另外,我们可以通过`forceTermination()`强制终止,也可以通过`isTerminated()`的标志方法进行测试。重写`onAdvance()`方法需要我们扩展`Phaser`类(通常通过匿名类)。
或者,当所有注册方到达当前阶段时,我们可以通过覆盖`onAdvance()`方法`onAdvance(int phase, int registeredParties)`来运行特定操作。如果要触发`Phaser`的终止,则此方法返回一个`boolean`值,即`true`。另外,我们可以通过`forceTermination()`强制终止,也可以通过`isTerminated()`的标志方法进行测试。覆盖`onAdvance()`方法需要我们扩展`Phaser`类(通常通过匿名类)。
在我们的代码中,编译成 JAR 的 Maven 模块`quick`只有在`sort`方法可以调用`qsort`的情况下才能使用。但是,我们不希望`qsort`直接从外部使用。在下一个版本中,我们可能希望开发一个使用来自`NonRecursiveQuickSort`类的`qsort`的版本,我们不希望客户抱怨他们的代码由于库的小升级而无法编译或工作。我们可以证明,内部方法和类是公共的,它们不是用来使用的,而是徒劳的。使用我们库的开发人员不阅读文档。这也是为什么我们不写过多的评论。没有人会读它,甚至执行代码的处理器也不会。
在我们的代码中,编译成 JAR 的 Maven 模块`quick`只有在`sort`方法可以调用`qsort`的情况下才能使用。但是,我们不希望`qsort`直接从外部使用。在下一个版本中,我们可能希望开发一个使用来自`NonRecursiveQuickSort`类的`qsort`的版本,我们不希望客户抱怨他们的代码由于库的小升级而无法编译或工作。我们可以证明,内部方法和类是公共的,它们不是用来使用的,而是徒劳的。使用我们库的开发人员不阅读文档。这也是为什么我们不写过多的注释。没有人会读它,甚至执行代码的处理器也不会。
它说启动由`supply_value`表示的`Supplier`,当它完成时,将这个值提供给由`consume_the_value`表示的消费者。示例代码计算 PI 的值并提供该值。`consume_the_value`部分将值打印到输出。当我们运行代码时,文本`All is scheduled`可能会首先打印到输出中,然后才打印 PI 的计算值。
服务器推送是对将来将出现的请求的 HTTP 响应。服务器如何回答一个甚至没有发出的请求?好吧,服务器已经预料到了。例如,应用发送一个 HTML 页面,其中引用了许多小图片和图标。客户端下载 HTML 页面,构建 DOM 结构,进行分析,实现所需图片,并发送图片请求。应用程序员知道那里有什么图片,甚至在浏览器请求图片之前就可以编写代码让服务器发送这些图片。每一个这种性质的响应都包含一个该响应所针对的 URL。当浏览器需要资源时,它会意识到资源已经存在,并且不会发出新的请求。在`HttpServlet`中,程序应该通过请求的新`getPushBuilder()`方法访问`PushBuilder`,并使用该方法将资源下推到客户端。
服务器推送是对将来将出现的请求的 HTTP 响应。服务器如何回答一个甚至没有发出的请求?好吧,服务器已经预料到了。例如,应用发送一个 HTML 页面,其中引用了许多小图片和图标。客户端下载 HTML 页面,构建 DOM 结构,进行分析,实现所需图片,并发送图片请求。程序员知道那里有什么图片,甚至在浏览器请求图片之前就可以编写代码让服务器发送这些图片。每一个这种性质的响应都包含一个该响应所针对的 URL。当浏览器需要资源时,它会意识到资源已经存在,并且不会发出新的请求。在`HttpServlet`中,程序应该通过请求的新`getPushBuilder()`方法访问`PushBuilder`,并使用该方法将资源下推到客户端。
通常,一个好的框架在逻辑上工作。我不知道Spring的这个特征,但我认为这是合乎逻辑的,而且神奇地,它起作用了。如果事情是合乎逻辑的,并且只是工作的话,你不需要阅读和记住文档。不过,稍微小心一点也不会有任何危害。在我意识到这个功能是这样工作的之后,我在文档中查阅了它,以看到这确实是 Spring 的一个保证特性,而不是仅仅发生在工作中的特性,而是在未来版本中可能会发生更改而不需要注意。仅使用保证功能是非常重要的,但在我们的行业中经常被忽略。
也可以引用实例方法,而不给出应该调用它的引用。这可以在函数式接口方法有一个额外的第一个参数的地方使用,这个参数将用作实例。我们已经在第 3 章中使用过了,“优化专业排序代码”,当我们通过`String::compareTo`时,当期望的参数是`Comparator`时。`compareTo()`方法需要一个参数,而`Comparator`接口中的`compare()`方法需要两个参数。在这种情况下,第一个参数将用作必须调用`compare()`的实例,第二个参数将传递给`compare()`。在这种情况下,`String::compareTo`与写入 Lambda 表达式`(String a, String b) -> a.compareTo(b)`相同。
当流是连续的时,从不调用组合器。但是当我们使它并行(`list.parallelStream()`)时,消息合并器被调用!打印了三次。好吧,在`reduce()`操作的情况下,部分结果的数量可能会有所不同,这取决于 CPU 的数量和`collect()`操作实现的内部逻辑。因此,消息组合器被称为!可打印任意次数
`@Param` is a standard Java annotation used by various frameworks, for example, JUnit. It identifies an array of parameter values. The test with the `@Param` annotation will be run as many times as there are values in the array. Each test execution picks up a different value from the array.