q7goodies事例_Java 8 Friday Goodies:精益并发

q7goodies事例

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了,……

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。

Java 8 Goodie:精益并发

曾经有人说过(不幸的是,我们没有消息来源了):

初级程序员认为并发很难。
经验丰富的程序员认为并发很容易。
高级程序员认为并发很难。

没错 但好的一面是,Java 8至少会通过使使用lambda和许多改进的API编写并发代码更加容易而至少会改善性能。 让我们仔细看看:

Java 8在JDK 1.0 API上的改进

从JDK 1.0开始就已经存在java.lang.Threadjava.lang.Runnable也是如此,它将在Java 8中用FunctionalInterface进行注释。

从现在开始,如何最终将Runnable提交到Thread几乎是不费吹灰之力。 假设我们有一个长期运行的操作:

public static int longOperation() {System.out.println("Running on thread #"+ Thread.currentThread().getId());// [...]return 42;
}

然后,我们可以通过各种方式将此操作传递给Threads ,例如

Thread[] threads = {// Pass a lambda to a threadnew Thread(() -> {longOperation();}),// Pass a method reference to a threadnew Thread(ThreadGoodies::longOperation)
};// Start all threads
Arrays.stream(threads).forEach(Thread::start);// Join all threads
Arrays.stream(threads).forEach(t -> {try { t.join(); }catch (InterruptedException ignore) {}
});

正如我们在之前的博客文章中提到的那样,lambda表达式找不到解决受检异常的精益方法真是可惜。 java.util.function包中新添加的功能接口均不允许抛出已检查的异常,从而将工作留给了调用站点。
jool-logo-黑色
因此,在上一篇文章中 ,我们发布了jOOλ(也称为jOOL,jOO-Lambda) ,它将每个JDK的功能接口包装在一个等效的功能接口中,该功能接口允许引发检查异常。 这对于旧的JDK API(例如JDBC)或上述Thread API尤其有用。 使用jOOλ ,我们可以这样写:

// Join all threads
Arrays.stream(threads).forEach(Unchecked.consumer(t -> t.join()
));

Java 8在Java 5 API上的改进

在Java 5出色的ExecutorService发行之前,Java的多线程API一直处于Hibernate状态。 管理线程一直是一个负担,人们需要外部库或J2EE / JEE容器来管理线程池。 使用Java 5可以轻松得多。现在,我们可以 RunnableCallable 提交ExecutorService ,后者可以管理自己的线程池。

这是一个示例,说明如何在Java 8中利用这些Java 5并发API:

ExecutorService service = Executors.newFixedThreadPool(5);Future[] answers = {service.submit(() -> longOperation()),service.submit(ThreadGoodies::longOperation)
};Arrays.stream(answers).forEach(Unchecked.consumer(f -> System.out.println(f.get())
));

注意,我们如何再次使用jOOλ中的UncheckedConsumer将从get()调用引发的已检查异常包装在RuntimeException

Java 8中的并行和ForkJoinPool

现在,Java 8 Streams API在并发性和并行性方面发生了很多变化。 例如,在Java 8中,您可以编写以下代码:

Arrays.stream(new int[]{ 1, 2, 3, 4, 5, 6 }).parallel().max().ifPresent(System.out::println);

尽管在这种特殊情况下没有必要,但仍然有趣的是,仅调用parallel() 即可在您的JDK内部ForkJoinPool的所有可用线程上运行IntStream.max() reduce操作,而无需担心涉及ForkJoinTasks 。 这可能非常有用,因为并非所有人都欢迎JDK 7 ForkJoin API引入的复杂性 。

在这篇有趣的InfoQ文章中了解有关Java 8并行流的更多信息。

有关Java 8的更多信息

并行是新Streams API背后的主要驱动力之一。 在许多情况下,能够仅在Stream上设置一个名为parallel()的标志是非常了不起的。

在上一个示例中,我们看到了OptionalInt.ifPresent()方法,该方法在先前的reduce操作成功的情况下执行IntConsumer参数。

其他语言,例如Scala,都知道一种“选项”类型可以改善NULL处理。 我们之前已在博客上介绍了Optional ,我们将在Java 8 Streams的上下文中重申Java 8 Optional类型,敬请期待!

同时,请查看Eugen Paraschiv出色的Java 8资源页面

翻译自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-lean-concurrency.html

q7goodies事例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业交换机的外壳设计重要吗?

工业交换机一般使用在环境比较恶劣的地方,例如工厂等,为了让工业交换机更好的使用,工业交换机的外壳设计起到至关重要的作用,工业交换机的外壳可以更好的保护工业交换机的使用,那么如何才能选到实用的工业交换机外壳呢…

工业交换机和工业4G路由器的区分

工业交换机也称作工业以太网交换机,即应用于工业控制领域的以太网交换机设备,由于采用的网络标准,其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议,以太网已经成为工业控制领域的主要通信标准。工业交换机具有…

工业交换机和工业级光纤收发器的区别

工业交换机和工业级光纤收发器都是网络数据传输设备中的重要组成部分。工业交换机是进行网络内数据交换的一种以太网连接设备,而工业级光纤收发器是延长传输距离的一种光电转换设备。那么他们之间具体有哪些不同之处呢?接下来就由飞畅科技的小编来为大家…

工业交换机选择时需要注意什么?

工业以太网交换机是用于连接以太网的设备,应用十分广泛,主要应用于:煤矿安全、轨道交通、工厂自动化、水处理系统、城市安防等。现如今,市场上的工业交换机品牌厂家有很多,如何选购合适的以太网交换机是件令人困扰的事…

html如何与php,html页面怎么跟php文件连接

HTML页面调用PHP文件的方法是要通过JavaScript来实现,在生成静态页面时,可以根据数据库id给html页面生成一个对应的JavaScript文件来调用PHP文件。HTML页面调用PHP文件的方法是要通过JavaScript来实现,在生成静态页面时,可以根据数…

为使节构建控制平面的指南第3部分-特定于域的配置API

这是探索为Envoy Proxy构建控制平面的系列文章的第3部分。 在本博客系列中,我们将研究以下领域: 采用一种机制来动态更新Envoy的路由,服务发现和其他配置 确定哪些组件构成了控制平面,包括后备存储,服务发现API&…

工业交换机中:千兆级别和快速级别传输效率对比

目前市面上的工业交换机种类繁多,我们在采购工业交换机的时候,一般都是按照传输速率来进行挑选的。千兆工业交换机和快速以太网交换机都是传输速率比较快的工业交换机,那么,他们之间有哪些区别呢?接下来就由飞畅科技的…

《操作系统A》期末考试复习题——大题51-62(手写笔记)

51、如果限制为两道的多道程序系统中,有4个作业进入系统,其进入系统时刻、估计运行时间为下图所示。系统采用SJF作业调度算法,采用SRTF进程调度算法。作业进入系统时刻、估计运行时间如下: 作业 进入系统时刻 估计运行时间/min …

php 登录记住密码,php 记住密码自动登录

做网站的时候会碰到记住密码,下次自动登录,一周内免登陆,一个月内免登陆这种需求。这种功能一般通过cookie来实现的。用户在登陆的时候,如果选择了记住密码或者一周内免登陆等这个选项的时候,则在用户成功登陆操作完成…

带有Spring Security的OAuth 2.0快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在构建Web应用程序时,必须进行身份验证和授权。 然而,正确地做…

工业以太网交换机在实际应用中的优势

相信大家对交换机应该都不陌生,交换机可以说应用于网络通信的各个方面,它极大的帮助我们提高了工作效率;但是一般我们会分为工业交换机和普通交换机,在实际应用当中,不同的环境和场合我们还是要有所区分的,…

带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云

在本文中,我将继续讲述在Oracle Digital Assistant和Oracle Digital Assistant的 基础上为FlexDeploy实现对话式UI的故事。 Fn项目 。 今天,我将围绕聊天机器人工作的无服务器API移到云中,因此整个解决方案都在云中工作: 该API是…

8口网管型工业以太网交换机产品性能介绍

8端口以太网交换机因其端口数量、价格都比较适中,所以是比较常见的一款产品。杭州飞畅科技为满足不同客户的需要,就8端口的工业交换机分别研发了网管型、非网管、8电口、2光6电、4光4电等多种规格。如果您这边有特殊规格的需求,飞畅科技也可以…

一号信令是什么?1号信令和7号信令的区别介绍!

1号信令又称为多频互控信令或随路信令。那么,什么是一号信令?一号信令是怎么分类的?1号信令常见问题有哪些?1号信令和7号信令之间有哪些区别呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 一、1号…

RS232、RS485和CAN协议总结与对比

RS232简单实用,缺陷是不支持多设备间的互连,缺少拓扑结构。由此诞生了RS485。RS485最重要的是采用两条差分线代替RS232的单线传输,支持拓扑结构。RS485属于电气层的协议,物理上的实现大都在RS232基础上完成。缺陷是主从轮询的方式…

php 回到顶部,jquery如何实现点击网页回到顶部效果?(图文+视频)

本篇文章主要给大家介绍如何用jquery代码实现网页回到顶部的效果。我们在浏览各大网站页面时,想必大家肯定都遇到过,当阅览一个长页面时,拉到下面部分会出现类似回到顶部的按钮特效吧。这种点击回到顶部的功能特效,可以很大程度上…

使用JDK 13查看TLS配置

JDK 13 Early Access Build 16现在可用,它带来的有趣的功能之一是能够使keytool命令行工具显示当前系统的TLS配置信息 。 这比尝试在单独的文档中查找受支持的TLS信息并使该信息与自己的JDK供应商和版本更容易。 要查看JDK 13 Early Access Build 16的TLS配置详细信…

串口服务器常见异常情况排除方法介绍

串口服务器就像一台带CPU、实时操作系统和TCP/IP协议的微型电脑,方便在串口和网络设备中传输数据。在使用串口服务器的过程中,一般按照操作手册进行操作基本上可以解决问题,但是,在实际操作中还是会出现一些异常故障,今…

ckfinder php 配置,php – 在Laravel 5中为CKEditor设置路径以使用CKFinder

您好我正在尝试将CKFinder与CKEditor集成到一个laravel项目中.我在CKEditor的config.js文件中进行了以下设置:CKEDITOR.editorConfig function( config ) {// Define changes to default configuration here. For example:// config.language fr;config.uiColor …

工业级光模块是什么?

可能很多人都不知道,光模块是所有网络连接部署中不可或缺的组成部分。一个产品的出现往往与市场需求相对应,我们平时所接触到的光模块大部分只能满足商业数据中心的网络部署,那么大型工业的网络部署该如何满足实现呢?在这种情况下&#xff0…