Java8高中并发
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高中并发的更多相关文章
- 【Java】关于Java8 parallelStream并发安全的思考
背景 Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream. 在爬虫开发 ...
- Java8 (1)
参考资料: <Java8 in Action> Raoul-Gabriel Urma 一.jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方 ...
- 《Thinking In Java》作者:不要使用并发!
前言 今天纯粹就是带你们来读读书的~ 最近除了工作,特地买回了自己很喜欢的作者新发售的一本书<On Java>,作者是我的老朋友布鲁斯·埃克尔,在Java领域很有名,你可能没听过他的名字, ...
- Java8并发教程:Threads和Executors
来之:ImportNew 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教程中的第一部分.在接下来的15分钟,你将会学会如 ...
- 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
大家可能都听说说 Java 中的并发包,如果想要读懂 Java 中的并发包,其核心就是要先读懂 CAS 机制,因为 CAS 可以说是并发包的底层实现原理. 今天就带大家读懂 CAS 是如何保证操作的原 ...
- 并发的核心:CAS 与synchronized, Java8是如何优化 CAS 的?
大家可能都听说说 Java 中的并发包,如果想要读懂 Java 中的并发包,其核心就是要先读懂 CAS 机制,因为 CAS 可以说是并发包的底层实现原理. 今天就带大家读懂 CAS 是如何保证操作的原 ...
- 什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升
问题1:HashM安排的初始长度,为什么? 初始长度是 16,每次扩展或者是手动初始化,长度必须是 2的幂. 因为: index = HashCode(Key) & (length - 1), ...
- java集合之hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升
众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...
- Java8学习笔记(十一)--并发与非并发流下reduce比较
BinaryOperator<Integer> operator = (l, r) -> l + r; BiFunction<Integer, Integer, Integer ...
随机推荐
- 进阶:案例六: Context Menu(静态 与 动态)
实现: 1.add: 2.delete 3.add2 实现步骤: 1.新建属性display_text 2.创建layout 3.代码部分: add事件: METHOD onactionadd . D ...
- shell telnet 路由器
#!/usr/bin/expect -f spawn telnet 172.16.1.80 expect "login" { send "admin\n" ex ...
- 重载(overload),覆盖/重写(override),隐藏(hide)
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...
- hdu 4687 带花树匹配
其实吧,思路挺简单的,只不过昨天刚学,还有一些东西不太了解,然后就23333333... 吃晚饭回来就A了,我是有多傻啊,这么题都A不掉,不能忍啊... 我们可以先求出哪些边是可能存在于最大匹配中的, ...
- MMA7455加速度传感器測量角度
使用加速度传感器应该注意几点: 第一:确保你的IIC是正确的: 第二,首先必须校准系统,校准方法,例如以下:将7455平放,保证z轴向下,这是假设系统是Ok的,那么x轴输出为0,y轴输出为0,z轴输出 ...
- windows下RabbitMQ 监控
RabbitMQ的监控很简单,网上也有很多资料,但是大都不详细,让人云里雾里,我这里详细总结下. RabbitMQ本身提供了一个web的监控页面,只需要简单的几部命令行就可以访问这个页面了. 1.打开 ...
- Qt4在linux下的安装
1.下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensou ...
- Swift - 带结果列表的搜索条(UISearchDisplayController)的用法
(注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能,可参考我的另一篇文章“Swift - 使用UISea ...
- 用Swift开发二维码扫描器教程
(原文:Building a QR Code Reader in Swift 作者:Simon Ng 译者:xiaoying )我相信大多数人都知道二维码(QR code)是什么,如果你对这个概念还不 ...
- Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good
引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...