咱们在《实战Java高并发程序设计》一书中,专门介绍过java 8中对并发的改进。这里我经过转载一篇博客来讲简单介绍下。html
有人曾经说过(很抱歉,咱们找不到原句了):java
初级程序员认为并发很难。
中级程序员认为并发很简单。
高级程序员认为并发很难。git
这说的很对。可是从好的方面来看,Java8为咱们带来了起色,经过lambda表达式和改进的API能够使得编写并发代码更容易。让咱们来具体的看看Java8的改进吧:程序员
java.lang.Thread早在JDK 1.0版本中就已经存在。在java8中被注解为功能性接口的java.lang.Runnable也是。github
从如今起,几乎不须要动大脑咱们就能够提交Runnables给一个线程。让咱们假设咱们有一个很耗时的操做:sql
publicstaticint longOperation() { System.out.println("Running on thread #" + Thread.currentThread().getId()); // [...] return42; }
咱们能够用多种方法把这个操做传递给线程,例如:api
Thread[] threads = { // Pass a lambda to a thread newThread(() -> { longOperation(); }), // Pass a method reference to a thread newThread(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λ,咱们能够这么写:高并发