Java8高中并发

Java8高中并发

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Java8中学并发

本文翻译自:http://jaxenter.com/lean-concurrency-in-java-8-49924.html

转载请注明出处:http://blog.csdn.net/kingviker/article/details/27057473

有人以前说过(非常不幸,我们没有原话了):

0基础程序猿觉得并发非常难。
中级程序猿觉得并发非常easy。
高级程序猿觉得并发非常难。

这说的非常对。可是从好的方面来看,通过lambda表达式和非常多改进的API使编写并发代码更easy,Java8并发开发至少能得到改善。让我们来详细的看看(Java8的改进):

Java8对JDK 1.0 API的改进。

java.lang.Thread早在JDK 1.0版本号中就已经存在。在java8中被注解为功能性接口java.lang.Runnable也是。

从如今起。差点儿不须要动大脑我们就能够提交Runnables给一个线程。让我们如果我们有一个非常耗时的操作:

public static int longOperation() {
    System.out.println("Running on thread #"
    + Thread.currentThread().getId());

    // [...]
    return 42;
}

我们能够用多种方法把这个操作传递给线程,比如:

Thread[] threads = {

    // Pass a lambda to a thread
    new Thread(() -> {
    longOperation();
    }),

    // Pass a method reference to a thread
    new 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包中新增的功能性接口没有一个涉及到抛出被检异常。把这项工作留给了调用端。

在上一篇博文中。我们已经因此而公布了jOOλ(also jOOL,jOO-Lambda)包,该包包装了JDK中的每个功能性接口,据有同样功能并且也同意抛出被检异常。

这在使用老的JDK API时特别实用,比如JDBC,或者上面提到的Thread API。使用jOOλ,我们能够这么写:

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

Java8中改进的Java5 API

Java的多线程在Java5的非常好的ExecutorService公布之前一直非常沉寂。管理多线程是一个负担,人们须要额外的库或者一个J2EE/JEE容器来管理线程池。

这些用Java5来处理已经easy了非常多。我们如今能够提交一个Runnable对象或者一个Callable对象到ExcutorService。它管理自己的线程池。

以下是一个我们怎样在Java8中利用这些Java5的并发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()方法抛出的被检异常。

Java8中的并行和ForkJoinPool

如今,Java8的Streams API在并发和并行方面有了非常大改进。 在Java8中你能够写出例如以下的代码:

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

尽管在这个特殊的样例中不是非常必要,但看到只调用了parallel()就执行IntStream.max()来启用ForkJoinPool而你不必操心包括的ForkJoinTasks还是非常有趣的。这是非常实用的。由于不是每一个人都可以接受JDK7该复合物的引入JorkJoin API

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117284.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • frp内网穿透设置_frp内网穿透原理

    frp内网穿透设置_frp内网穿透原理十分钟教你配置frp实现内网穿透一、frp的作用利用处于内网或防火墙后的机器,对外网环境提供http或https服务。 对于http,https服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。 利用处于内网或防火墙后的机器,对外网环境提供tcp和udp服务,例如在家里通过ssh访问处于公司内网环境内的主机。二、配置说明1、…

  • docker导出镜像命令_docker批量导出镜像

    docker导出镜像命令_docker批量导出镜像docker导出镜像docker导出镜像使用dockersave命令,可以使用dockersave–help查看用法为dcokersave[镜像名]:[TAG]-o[保存后文件名]-o,–output#输出为文件,后跟保存后的文件名[TAG]可以通过dockerimages查看示例…

  • 十七岁的单车 影评

    十七岁的单车 影评

  • Ios frida_frida

    Ios frida_frida一、FridaFrida是一款基于Python+javascript的hook框架,通杀android\iOS\linux\win\osx各平台。Frida原理是手机端安装一个server程序把手机端的端口转到PC端写的python脚本进行通信,而Python脚本中采用javascript语言编写hook代码。①installfridaondeviceStartCydiaandaddFrida’srepositorybynavig

    2022年10月30日
  • redis的五种数据类型

    redis的五种数据类型一、百度百科1、简介(1)Redis(RemoteDictionaryServer远程字段服务)是一个开源的使用ANSIC语言编写、支持网络、科技与内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。(2)Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sortedset–有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,

  • 手把手教你Tomcat配置环境变量以及验证方法

    手把手教你Tomcat配置环境变量以及验证方法场景现在要将Tomcat配置进环境变量。实现以win7为例,找到桌面计算机图表,右键属性。或者打开计算机,找到系统属性。然后找到高级系统设置找到环境变量点击系统变量下的新建找到Tomcat所在目录变量名为:CATALINA_BASE内容为Tomcat所在路径,这里是上面的路径如图:点击确定同理再新建系统变量,变量名…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号