Java8中学并发
来源:互联网 发布:淘宝我的服务 编辑:程序博客网 时间:2024/04/29 02:53
Java8中学并发
本文翻译自:http://jaxenter.com/lean-concurrency-in-java-8-49924.html
转载请注明出处:http://blog.csdn.net/kingviker/article/details/27057473
有人曾经说过(很不幸,我们没有原话了):
初级程序员认为并发很难。
中级程序员认为并发很简单。
高级程序员认为并发很难。
这说的很对。但是从好的方面来看,通过lambda表达式和很多改进的API使编写并发代码更容易,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 threadsArrays.stream(threads).forEach(Thread::start);// Join all threadsArrays.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 threadsArrays.stream(threads).forEach(Unchecked.consumer( t -> t.join()));
Java8中改进的Java5 API
Java的多线程在Java5的非常好的ExecutorService发布之前一直很沉寂。管理多线程是一个负担,人们需要额外的库或者一个J2EE/JEE容器来管理线程池。这些用Java5来处理已经容易了很多。我们现在可以提交一个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中学并发
- Java8中的简易并发
- Java8 Stream 的并发
- 第六章 Java8与并发
- java8 lumbda 、Executors处理线程并发
- 【Java8源码分析】并发包-AtomicInteger
- 【Java8源码分析】并发包-CopyOnWriteArrayList
- 【Java8源码分析】并发包-Semaphore
- 【Java8源码分析】并发包-CountDownLatch
- 【Java8源码分析】并发包-CyclicBarrier
- Java8 并发教程之Thread与Executors
- Java8 并发之原子变量与ConcurrentMap
- Java8
- java8
- Java8
- java8
- java8
- java8
- Android记录异常到本地
- Breaking news: HTML+CSS is Turing complete
- 安装超声波流量计传感器应注意环境的影响
- 关于旅行
- 隐藏webView的缩放按钮
- Java8中学并发
- ztree树查询
- C++数据类型简介
- MySQL 5.1.73升级为MySQL 5.5.35
- 读取文件并输出到客户端
- 史上最强劲的android模拟器命令详解
- 这些事情其实离你没有那么远 如此远 又如此地近
- MyEclipse异常:Class file name must end with .class
- 使用C#创建简单的联系人备忘录