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

Java8高中并发的更多相关文章

  1. 【Java】关于Java8 parallelStream并发安全的思考

    背景 Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream. 在爬虫开发 ...

  2. Java8 (1)

    参考资料: <Java8 in Action> Raoul-Gabriel Urma 一.jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方 ...

  3. 《Thinking In Java》作者:不要使用并发!

    前言 今天纯粹就是带你们来读读书的~ 最近除了工作,特地买回了自己很喜欢的作者新发售的一本书<On Java>,作者是我的老朋友布鲁斯·埃克尔,在Java领域很有名,你可能没听过他的名字, ...

  4. Java8并发教程:Threads和Executors

    来之:ImportNew 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教程中的第一部分.在接下来的15分钟,你将会学会如 ...

  5. 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?

    大家可能都听说说 Java 中的并发包,如果想要读懂 Java 中的并发包,其核心就是要先读懂 CAS 机制,因为 CAS 可以说是并发包的底层实现原理. 今天就带大家读懂 CAS 是如何保证操作的原 ...

  6. 并发的核心:CAS 与synchronized, Java8是如何优化 CAS 的?

    大家可能都听说说 Java 中的并发包,如果想要读懂 Java 中的并发包,其核心就是要先读懂 CAS 机制,因为 CAS 可以说是并发包的底层实现原理. 今天就带大家读懂 CAS 是如何保证操作的原 ...

  7. 什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升

    问题1:HashM安排的初始长度,为什么? 初始长度是 16,每次扩展或者是手动初始化,长度必须是 2的幂. 因为: index = HashCode(Key) & (length - 1), ...

  8. java集合之hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升

    众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...

  9. Java8学习笔记(十一)--并发与非并发流下reduce比较

    BinaryOperator<Integer> operator = (l, r) -> l + r; BiFunction<Integer, Integer, Integer ...

随机推荐

  1. 用angularjs开发下一代web应用(二):angularjs应用骨架(二)

    1.浅谈非入侵式JavaScript <div ng-click="doSomething()">...</div>这些指令和原来的事件处理器有下面不同之处 ...

  2. K. Perpetuum Mobile

    The world famous scientist Innokentiy almost finished the creation of perpetuum mobile. Its main par ...

  3. UpdateWindow API函数的作用很明显

    待续 摘自<Delphi深度历险>

  4. SpringMVC之Controller传递JSON数据到页面

    在Controller中,组装好JSON格式的数据,然后输入到页面,或者通过ajax请求在页面进行解析,都可以做到. 1.Controller /** * JSON DATA TO PAGE VEIW ...

  5. Hibernate获取Connection

    package com.trendcom.base.util; import java.sql.Connection; import java.sql.SQLException; import jav ...

  6. 九度OJ 1179 阶乘(模拟)

    题目1179:阶乘 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4526 解决:1315 题目描写叙述: 输入n, 求y1=1!+3!+...m!(m是小于等于n的最大奇数) y2=2! ...

  7. 2013Esri全球用户大会之ArcGIS for Desktop

    Q1:ArcGIS 10.2 for Desktop中有哪些新特性?     增强的质量和性能        扩展并行处理能力        许多软件质量的改进        优化的文件处理     ...

  8. Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋

    Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始

  9. java 显示目录下全部文件

    package gao.org; import java.awt.HeadlessException; import java.io.File; import javax.swing.JFileCho ...

  10. CodeForces 13E. Holes 分块处理

    正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多..     分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...