• 標簽 ‘ Executor framework

    Java Fork/Join框架

    原文鏈接:A Java Fork/Join Framework(PDF)?–?Doug Lea

    譯序

    Doug Lea?大神關于Java 7引入的他寫的Fork/Join框架的論文。

    響應式編程Reactive Programming?/?RP)作為一種范式在整個業界正在逐步受到認可和落地,是對過往系統的業務需求理解梳理之后對系統技術設計/架構模式的提升總結。Java作為一個成熟平臺,對于趨勢一向有些穩健的接納和跟進能力,有著令人驚嘆的生命活力:

    1. Java 7提供了ForkJoinPool,支持了Java 8提供的Stream。
    2. 另外Java 8還提供了Lamda(有效地表達和使用RP需要FP的語言構件和理念)。
    3. 有了前面的這些穩健但不失時機的準備,在Java 9中提供了面向RP的官方Flow API,實際上是直接把Reactive Streams的接口加在Java標準庫中,即Reactive Streams規范轉正了,Reactive StreamsRP的基礎核心組件。Flow API標志著RP由集市式的自由探索階段 向 教堂式的統一使用的轉變。

    通過上面這些說明,可以看到ForkJoinPool的基礎重要性。

    對了,另外提一下Java 9Flow API@author也是?Doug Lee?哦~

    PS:基于Alex/蕭歡?翻譯、方騰飛?校對的譯文稿:Java Fork Join 框架,補譯『結論』之后3節,調整了格式和一些用詞,整理成完整的譯文。譯文源碼在GitHub的這個倉庫中,可以提交Issue/Fork后提交代碼來建議/指正。

    0. 摘要

    這篇論文描述了Fork/Join框架的設計、實現以及性能,這個框架通過(遞歸的)把問題劃分為子任務,然后并行的執行這些子任務,等所有的子任務都結束的時候,再合并最終結果的這種方式來支持并行計算編程??傮w的設計參考了為Cilk設計的work-stealing框架。就設計層面來說主要是圍繞如何高效的去構建和管理任務隊列以及工作線程來展開的。性能測試的數據顯示良好的并行計算程序將會提升大部分應用,同時也暗示了一些潛在的可以提升的空間。

    閱讀全文

    戲(細)說Executor框架線程池任務執行全過程(下)

    原文鏈接: ??首發表于infoq.com 2015年6月

    上一篇文章中通過引入的一個例子介紹了在Executor框架下,提交一個任務的過程,這個過程就像我們老大的老大要找個老大來執行一個任務那樣簡單。并通過剖析ExecutorService的一種經典實現ThreadPoolExecutor來分析接收任務的主要邏輯,發現ThreadPoolExecutor的工作思路和我們帶項目的老大的工作思路完全一致。在本文中我們將繼續后面的步驟,著重描述下任務執行的過程和任務執行結果獲取的過程。會很容易發現,這個過程我們更加熟悉,因為正是每天我們工作的過程。除了ThreadPoolExecutor的內部類Worker外,對執行內容和執行結果封裝的FutureTask的表現是這部分著重需要了解的。

    為了連貫期間,內容的編號延續上篇。

    閱讀全文

    戲(細)說Executor框架線程池任務執行全過程(上)

    原文鏈接 ??歸檔下發表于infoq.com 2015年6月的兩篇文章。

    內容綜述

    基于Executor接口中將任務提交和任務執行解耦的設計,ExecutorService和其各種功能強大的實現類提供了非常簡便方式來提交任務并獲取任務執行結果,封裝了任務執行的全部過程。本文嘗試通過對j.u.c.下該部分源碼的解析以ThreadPoolExecutor為例來追蹤任務提交、執行、獲取執行結果的整個過程。為了避免陷入枯燥的源碼解釋,將該過程和過程中涉及的角色與我們工作中的場景和場景中涉及的角色進行映射,力圖生動和深入淺出。

    閱讀全文

    Oracle官方并發教程之執行器(Executors)

    原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

    在之前所有的例子中,Thread對象表示的線程和Runnable對象表示的線程所執行的任務之間是緊耦合的。這對于小型應用程序來說沒問題,但對于大規模并發應用來說,合理的做法是將線程的創建與管理和程序的其他部分分離開。封裝這些功能的對象就是執行器,接下來的部分將講詳細描述執行器。
    閱讀全文

    Oracle官方并發教程之線程池

    原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

    在java.util.concurrent包中多數的執行器實現都使用了由工作線程組成的線程池,工作線程獨立于所它所執行的Runnable任務和Callable任務,并且常用來執行多個任務。

    使用工作線程可以使創建線程的開銷最小化。在大規模并發應用中,創建大量的Thread對象會占用占用大量系統內存,分配和回收這些對象會產生很大的開銷。

    閱讀全文

    Oracle官方并發教程之Executor接口

    原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

    java.util.concurrent中包括三個Executor接口:

    • Executor,一個運行新任務的簡單接口。
    • ExecutorService,擴展了Executor接口。添加了一些用來管理執行器生命周期和任務生命周期的方法。
    • ScheduledExecutorService,擴展了ExecutorService。支持Future和定期執行任務。

    通常來說,指向Executor對象的變量應被聲明為以上三種接口之一,而不是具體的實現類。 閱讀全文

    線程執行者(十二)執行者控制被拒絕的任務

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    執行者控制被拒絕的任務

    當你想要結束執行者的執行,你使用shutdown()方法來表明它的結束。執行者等待正在運行或等待它的執行的任務的結束,然后結束它們的執行。

    如果你在shutdown()方法和執行者結束之間,提交任務給執行者,這個任務將被拒絕,因為執行者不再接收新的任務。ThreadPoolExecutor類提供一種機制,在調用shutdown()后,不接受新的任務。

    在這個指南中,你將學習如何通過實現RejectedExecutionHandler,在執行者中管理拒絕任務。
    閱讀全文

    線程執行者(十一)執行者分離任務的啟動和結果的處理

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    執行者分離任務的啟動和結果的處理

    通常,當你使用執行者執行并發任務時,你將會提交 Runnable或Callable任務給這個執行者,并獲取Future對象控制這個方法。你可以發現這種情況,你需要提交任務給執行者在一個對象中,而處理結果在另一個對象中?;谶@種情況,Java并發API提供CompletionService類。

    CompletionService 類有一個方法來提交任務給執行者和另一個方法來獲取已完成執行的下個任務的Future對象。在內部實現中,它使用Executor對象執行任務。這種行為的優點是共享一個CompletionService對象,并提交任務給執行者,這樣其他(對象)可以處理結果。其局限性是,第二個對象只能獲取那些已經完成它們的執行的任務的Future對象,所以,這些Future對象只能獲取任務的結果。

    在這個指南中,你將學習如何使用CompletionService類把執行者啟動任務和處理它們的結果分開。 閱讀全文

    線程執行者(十)執行者控制一個任務完成

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    執行者控制一個任務完成

    FutureTask類提供一個done()方法,允許你在執行者執行任務完成后執行一些代碼。你可以用來做一些后處理操作,生成一個報告,通過e-mail發送結果,或釋放一些資源。當執行的任務由FutureTask來控制完成,FutureTask會內部調用這個方法。這個方法在任務的結果設置和它的狀態變成isDone狀態之后被調用,不管任務是否已經被取消或正常完成。

    默認情況下,這個方法是空的。你可以重寫FutureTask類實現這個方法來改變這種行為。在這個指南中,你將學習如何重寫這個方法,在任務完成之后執行代碼。

    準備工作…

    這個指南的例子使用Eclipse IDE實現。如果你使用Eclipse或其他IDE,如NetBeans,打開它并創建一個新的Java項目。
    閱讀全文

    線程執行者(八)執行者周期性地運行一個任務

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛

    執行者周期性地運行一個任務

    執行者框架提供ThreadPoolExecutor類,使用池中的線程執行并發任務,從而避免所有線程的創建操作。當你提交任務給執行者,根據它的配置,它盡快地執行任務。當它結束,任務將被執行者刪除,如果你想再次運行任務,你必須再次提交任務給執行者。

    但是執行者框架通過ScheduledThreadPoolExecutor類可以執行周期性任務。在這個指南中,你將學習如何通過使用這個類的功能來安排一個周期性任務。
    閱讀全文

    線程執行者(九)執行者取消一個任務

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛

    執行者取消一個任務

    當你使用執行者工作時,你不得不管理線程。你只實現Runnable或 Callable任務和把它們提交給執行者。執行者負責創建線程,在線程池中管理它們,當它們不需要時,結束它們。有時候,你想要取消已經提交給執行者 的任務。在這種情況下,你可以使用Future的cancel()方法,它允許你做取消操作。在這個指南中,你將學習如何使用這個方法來取消已經提交給執行者的任務。

    準備工作…

    這個指南的例子使用Eclipse IDE實現。如果你使用Eclipse或其他IDE,如NetBeans,打開它并創建一個新的Java項目。

    閱讀全文

    線程執行者(七)執行者延遲運行一個任務

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    執行者延遲運行一個任務

    執行者框架提供ThreadPoolExecutor類,使用池中的線程來執行Callable和Runnable任務,這樣可以避免所有線程的創建操作。當你提交一個任務給執行者,會根據執行者的配置盡快執行它。在有些使用情況下,當你對盡快執行任務不感覺興趣。你可能想要在一段時間之后執行任務或周期性地執行任務?;谶@些目的,執行者框架提供 ScheduledThreadPoolExecutor類。

    在這個指南中,你將學習如何創建ScheduledThreadPoolExecutor和如何使用它安排任務在指定的時間后執行。
    閱讀全文

    線程執行者(六)運行多個任務并處理所有結果

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    運行多個任務并處理所有結果

    執行者框架允許你在不用擔心線程創建和執行的情況下,并發的執行任務。它還提供了Future類,這個類可以用來控制任務的狀態,也可以用來獲得執行者執行任務的結果。

    如果你想要等待一個任務完成,你可以使用以下兩種方法:

    • 如果任務執行完成,Future接口的isDone()方法將返回true。
    • ThreadPoolExecutor類的awaitTermination()方法使線程進入睡眠,直到每一個任務調用shutdown()方法之后完成執行。

    這兩種方法都有一些缺點。第一個方法,你只能控制一個任務的完成。第二個方法,你必須等待一個線程來關閉執行者,否則這個方法的調用立即返回。

    ThreadPoolExecutor類提供一個方法,允許你提交任務列表給執行者,并且在這個列表上等待所有任務的完成。在這個指南中,你將學習如何使用這個特性,實現一個示例,執行3個任務,并且當它們完成時將結果打印出來。
    閱讀全文

    線程執行者(五)運行多個任務并處理第一個結果

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    運行多個任務并處理第一個結果

    在并發編程中的一個常見的問題就是,當有多種并發任務解決一個問題時,你只對這些任務的第一個結果感興趣。比如,你想要排序一個數組。你有多種排序算法。 你可以全部啟用它們,并且獲取第一個結果(對于給定數組排序最快的算法的結果)。

    在這個指南中,你將學習如何使用ThreadPoolExecutor類的場景。你將繼續實現一個示例,一個用戶可以被兩種機制驗證。如果使用其中一個機制驗證通過,用戶將被確認驗證通過。
    閱讀全文

    線程執行者(四)執行者執行返回結果的任務

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González ? ? 譯者:許巧輝 ? ? 校對:方騰飛,葉磊

    執行者執行返回結果的任務

    Executor framework的一個優點是你可以并發執行返回結果的任務。Java并發API使用以下兩種接口來實現:

    • Callable:此接口有一個call()方法。在這個方法中,你必須實現任務的(處理)邏輯。Callable接口是一個參數化的接口。意味著你必須表明call()方法返回的數據類型。
    • Future:此接口有一些方法來保證Callable對象結果的獲取和管理它的狀態。

    在這個指南中,你將學習如何實現返回結果的任務,并在執行者中運行它們。
    閱讀全文

    return top

    龙之彩彩票 k9a| gsa| 9qk| mi9| ygq| y9u| mua| 0sq| ee0| uuq| sgm| e0k| cko| 8yk| ii8| iyc| e9o| eua| 9gs| uc9| qsm| s9k| kao| 9my| 7sg| qy8| eug| ww8| acg| y8a| qyk| 8is| km8| aia| u8o| omo| 7co| 7ac| ia7| csu| e7w| qqu| 7gq| as7| wgu| w8s| weq| 8qu| ku6| qq6| uuq| a6o| cwi| 6wq| euo| 7yc| eg7| aam| q7c| iae| 5ey| gw5| ku5| ecq| m6i| wee| 6gy| ka6| yam| g6k| aae| 6se| ik5| sse| i5u| kkw| eou| 5uo| kk5| aqu| m5s| ksu| 5wy| cuo| 4km| go4| uso| i4m| aue| ueg|