q7goodies事例_Java 8 Friday Goodies:精益并发
q7goodies事例
在Data Geekery ,我們喜歡Java。 而且,由于我們真的很喜歡jOOQ的流暢的API和查詢DSL ,我們對Java 8將為我們的生態系統帶來什么感到非常興奮。 我們已經寫了一些關于Java 8好東西的博客 ,現在我們覺得是時候開始一個新的博客系列了,……
Java 8星期五
每個星期五,我們都會向您展示一些不錯的教程風格的Java 8新功能,這些功能利用了lambda表達式,擴展方法和其他出色的功能。 您可以在GitHub上找到源代碼 。
Java 8 Goodie:精益并發
曾經有人說過(不幸的是,我們沒有消息來源了):
初級程序員認為并發很難。
經驗豐富的程序員認為并發很容易。
高級程序員認為并發很難。
沒錯 但好的一面是,Java 8至少會通過使使用lambda和許多改進的API編寫并發代碼更加容易而至少會改善性能。 讓我們仔細看看:
Java 8在JDK 1.0 API上的改進
從JDK 1.0開始就已經存在java.lang.Thread 。 java.lang.Runnable也是如此,它將在Java 8中用FunctionalInterface進行注釋。
從現在開始,如何最終將Runnable提交到Thread幾乎是不費吹灰之力。 假設我們有一個長期運行的操作:
public static int longOperation() {System.out.println("Running on thread #"+ Thread.currentThread().getId());// [...]return 42; }然后,我們可以通過各種方式將此操作傳遞給Threads ,例如
Thread[] threads = {// Pass a lambda to a threadnew Thread(() -> {longOperation();}),// Pass a method reference to a threadnew Thread(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λ(也稱為jOOL,jOO-Lambda) ,它將每個JDK的功能接口包裝在一個等效的功能接口中,該功能接口允許引發檢查異常。 這對于舊的JDK API(例如JDBC)或上述Thread API尤其有用。 使用jOOλ ,我們可以這樣寫:
Java 8在Java 5 API上的改進
在Java 5出色的ExecutorService發行之前,Java的多線程API一直處于Hibernate狀態。 管理線程一直是一個負擔,人們需要外部庫或J2EE / JEE容器來管理線程池。 使用Java 5可以輕松得多。現在,我們可以將 Runnable或Callable 提交給ExecutorService ,后者可以管理自己的線程池。
這是一個示例,說明如何在Java 8中利用這些Java 5并發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()調用引發的已檢查異常包裝在RuntimeException 。
Java 8中的并行和ForkJoinPool
現在,Java 8 Streams API在并發性和并行性方面發生了很多變化。 例如,在Java 8中,您可以編寫以下代碼:
Arrays.stream(new int[]{ 1, 2, 3, 4, 5, 6 }).parallel().max().ifPresent(System.out::println);盡管在這種特殊情況下沒有必要,但仍然有趣的是,僅調用parallel() 即可在您的JDK內部ForkJoinPool的所有可用線程上運行IntStream.max() reduce操作,而無需擔心涉及ForkJoinTasks 。 這可能非常有用,因為并非所有人都歡迎JDK 7 ForkJoin API引入的復雜性 。
在這篇有趣的InfoQ文章中了解有關Java 8并行流的更多信息。
有關Java 8的更多信息
并行是新Streams API背后的主要驅動力之一。 在許多情況下,能夠僅在Stream上設置一個名為parallel()的標志是非常了不起的。
在上一個示例中,我們看到了OptionalInt.ifPresent()方法,該方法在先前的reduce操作成功的情況下執行IntConsumer參數。
其他語言,例如Scala,都知道一種“選項”類型可以改善NULL處理。 我們之前已在博客上介紹了Optional ,我們將在Java 8 Streams的上下文中重申Java 8 Optional類型,敬請期待!
同時,請查看Eugen Paraschiv出色的Java 8資源頁面
翻譯自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-lean-concurrency.html
q7goodies事例
總結
以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:精益并发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕将推 ROG 白夜魔机械键盘:75%
- 下一篇: 安兔兔公布iPhone 15 Pro M