我们在《实战Java高并发程序设计》一书中,专门介绍过java 8中对并发的改进。这里我通过转载一篇博客来说简单介绍下。
有人曾经说过(很抱歉,我们找不到原句了):
初级程序员认为并发很难。
中级程序员认为并发很简单。
高级程序员认为并发很难。
这说的很对。但是从好的方面来看,Java8为我们带来了转机,通过lambda表达式和改进的API可以使得编写并发代码更容易。让我们来具体的看看Java8的改进吧:
Java8对JDK 1.0 API的改进
java.lang.Thread早在JDK 1.0版本中就已经存在。在java8中被注解为功能性接口的java.lang.Runnable也是。
从现在起,几乎不需要动大脑我们就可以提交Runnables给一个线程。让我们假设我们有一个很耗时的操作:
1publicstaticint longOperation() { 2 System.out.println("Running 3 on thread #" 4 + 5 Thread.currentThread().getId()); 6 7 // 8 [...] 9 return42; 10}
我们可以用多种方法把这个操作传递给线程,例如:
1Thread[] 2 threads = { 3 4 5 6 // 7 Pass a lambda to a thread 8 9 newThread(() 10 -> { 11 12 longOperation(); 13 14 }), 15 16 17 18 // 19 Pass a method reference to a thread 20 21 newThread(ThreadGoodies::longOperation) 22 23}; 24 25 26 27// 28 Start all threads 29 30Arrays.stream(threads).forEach(Thread::start); 31 32 33 34// 35 Join all threads 36 37Arrays.stream(threads).forEach(t 38 -> { 39 40 try{ 41 t.join(); } 42 43 catch(InterruptedException 44 ignore) {} 45 46});
就像我们在之前的博文里提到的一样,lambda表达式没有一个简洁的方式来处理被检查异常实在是一大憾事。在java.util.function包中新增的功能性接口都不会抛出被检查异常,把这项工作留给了调用端。
在上一篇博文中,我们已经因此而发布了jOOλ(also jOOL,jOO-Lambda)包,该包包装了JDK中的每一个功能性接口,具有相同功能而且也允许抛出被检异常。这在使用老的JDK API时特别有用,例如JDBC,或者上面提到的Thread API。使用jOOλ,我们可以这么写: