q7goodies事例_Java 8 Friday Goodies:精益并发
q7goodies事例
在Data Geekery ,我們喜歡Java。 而且,由于我們真的很喜歡jOOQ的流暢的API和查詢(xún)DSL ,我們對(duì)Java 8將為我們的生態(tài)系統(tǒng)帶來(lái)什么感到非常興奮。 我們已經(jīng)寫(xiě)了一些關(guān)于Java 8好東西的博客 ,現(xiàn)在我們覺(jué)得是時(shí)候開(kāi)始一個(gè)新的博客系列了,……
Java 8星期五
每個(gè)星期五,我們都會(huì)向您展示一些不錯(cuò)的教程風(fēng)格的Java 8新功能,這些功能利用了lambda表達(dá)式,擴(kuò)展方法和其他出色的功能。 您可以在GitHub上找到源代碼 。
Java 8 Goodie:精益并發(fā)
曾經(jīng)有人說(shuō)過(guò)(不幸的是,我們沒(méi)有消息來(lái)源了):
初級(jí)程序員認(rèn)為并發(fā)很難。
經(jīng)驗(yàn)豐富的程序員認(rèn)為并發(fā)很容易。
高級(jí)程序員認(rèn)為并發(fā)很難。
沒(méi)錯(cuò) 但好的一面是,Java 8至少會(huì)通過(guò)使使用lambda和許多改進(jìn)的API編寫(xiě)并發(fā)代碼更加容易而至少會(huì)改善性能。 讓我們仔細(xì)看看:
Java 8在JDK 1.0 API上的改進(jìn)
從JDK 1.0開(kāi)始就已經(jīng)存在java.lang.Thread 。 java.lang.Runnable也是如此,它將在Java 8中用FunctionalInterface進(jìn)行注釋。
從現(xiàn)在開(kāi)始,如何最終將Runnable提交到Thread幾乎是不費(fèi)吹灰之力。 假設(shè)我們有一個(gè)長(zhǎng)期運(yùn)行的操作:
public static int longOperation() {System.out.println("Running on thread #"+ Thread.currentThread().getId());// [...]return 42; }然后,我們可以通過(guò)各種方式將此操作傳遞給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) {} }); 正如我們?cè)谥暗牟┛臀恼轮刑岬降哪菢?#xff0c;lambda表達(dá)式找不到解決受檢異常的精益方法真是可惜。 java.util.function包中新添加的功能接口均不允許拋出已檢查的異常,從而將工作留給了調(diào)用站點(diǎn)。
因此,在上一篇文章中 ,我們發(fā)布了jOOλ(也稱(chēng)為jOOL,jOO-Lambda) ,它將每個(gè)JDK的功能接口包裝在一個(gè)等效的功能接口中,該功能接口允許引發(fā)檢查異常。 這對(duì)于舊的JDK API(例如JDBC)或上述Thread API尤其有用。 使用jOOλ ,我們可以這樣寫(xiě):
Java 8在Java 5 API上的改進(jìn)
在Java 5出色的ExecutorService發(fā)行之前,Java的多線程API一直處于Hibernate狀態(tài)。 管理線程一直是一個(gè)負(fù)擔(dān),人們需要外部庫(kù)或J2EE / JEE容器來(lái)管理線程池。 使用Java 5可以輕松得多。現(xiàn)在,我們可以將 Runnable或Callable 提交給ExecutorService ,后者可以管理自己的線程池。
這是一個(gè)示例,說(shuō)明如何在Java 8中利用這些Java 5并發(fā)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()) ));注意,我們?nèi)绾卧俅问褂胘OOλ中的UncheckedConsumer將從get()調(diào)用引發(fā)的已檢查異常包裝在RuntimeException 。
Java 8中的并行和ForkJoinPool
現(xiàn)在,Java 8 Streams API在并發(fā)性和并行性方面發(fā)生了很多變化。 例如,在Java 8中,您可以編寫(xiě)以下代碼:
Arrays.stream(new int[]{ 1, 2, 3, 4, 5, 6 }).parallel().max().ifPresent(System.out::println);盡管在這種特殊情況下沒(méi)有必要,但仍然有趣的是,僅調(diào)用parallel() 即可在您的JDK內(nèi)部ForkJoinPool的所有可用線程上運(yùn)行IntStream.max() reduce操作,而無(wú)需擔(dān)心涉及ForkJoinTasks 。 這可能非常有用,因?yàn)椴⒎撬腥硕細(xì)g迎JDK 7 ForkJoin API引入的復(fù)雜性 。
在這篇有趣的InfoQ文章中了解有關(guān)Java 8并行流的更多信息。
有關(guān)Java 8的更多信息
并行是新Streams API背后的主要驅(qū)動(dòng)力之一。 在許多情況下,能夠僅在Stream上設(shè)置一個(gè)名為parallel()的標(biāo)志是非常了不起的。
在上一個(gè)示例中,我們看到了OptionalInt.ifPresent()方法,該方法在先前的reduce操作成功的情況下執(zhí)行IntConsumer參數(shù)。
其他語(yǔ)言,例如Scala,都知道一種“選項(xiàng)”類(lèi)型可以改善NULL處理。 我們之前已在博客上介紹了Optional ,我們將在Java 8 Streams的上下文中重申Java 8 Optional類(lèi)型,敬請(qǐng)期待!
同時(shí),請(qǐng)查看Eugen Paraschiv出色的Java 8資源頁(yè)面
翻譯自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-lean-concurrency.html
q7goodies事例
總結(jié)
以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:精益并发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华硕将推 ROG 白夜魔机械键盘:75%
- 下一篇: Java将列表转换为数组,反之亦然