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