咱們在《實戰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λ,咱們能夠這麼寫:高併發