日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

q7goodies事例_Java 8 Friday Goodies:精益并发

發布時間:2023/12/3 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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λ ,我們可以這樣寫:

// Join all threads Arrays.stream(threads).forEach(Unchecked.consumer(t -> t.join() ));

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:精益并发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。