国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【并發(fā)編程篇】詳解Forkjoin

這篇具有很好參考價(jià)值的文章主要介紹了【并發(fā)編程篇】詳解Forkjoin。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【并發(fā)編程篇】詳解Forkjoin,并發(fā)編程,python,java,開發(fā)語言

??什么是Forkjoin

Fork/Join 是一種在多線程領(lǐng)域中常用的算法或技術(shù),它的核心思想是將大任務(wù)分割成若干個(gè)小任務(wù),然后將這些小任務(wù)分配給多個(gè)線程并行處理,最終將結(jié)果合并起來。這種思想可以應(yīng)用于多種場景,例如圖像處理、批處理、并行排序等。

在 Java 中,F(xiàn)ork/Join 這種思想被封裝在了 java.util.concurrent 包中的 ForkJoinPool 類和 RecursiveTask 類中。ForkJoinPool 類是一個(gè)線程池,用于管理多個(gè)線程的執(zhí)行,而 RecursiveTask 類則是一個(gè)抽象類,用于定義可分解的任務(wù)。通過使用這些類,開發(fā)者可以非常方便地實(shí)現(xiàn) Fork/Join 的并行計(jì)算功能,從而提高應(yīng)用程序的性能和效率。

總之,F(xiàn)ork/Join 并不是一個(gè)框架,而是一種并發(fā)編程技術(shù),它可以幫助開發(fā)者實(shí)現(xiàn)高效的并行計(jì)算,并發(fā)揮多核 CPU 的計(jì)算能力。

??Forkjoin的方法

Fork/Join 框架提供了一些核心的方法來支持任務(wù)的分解和合并,下面我會(huì)對這些方法進(jìn)行理論講解:

  • fork() 方法:fork() 方法用于將當(dāng)前任務(wù)進(jìn)行分解,將其拆分成更小的子任務(wù)并提交給 Fork/Join 框架進(jìn)行并行處理。該方法會(huì)異步地啟動(dòng)一個(gè)新的子任務(wù),并立即返回,不會(huì)阻塞當(dāng)前線程。
  • join() 方法:join() 方法用于等待子任務(wù)的執(zhí)行完成,并獲取其結(jié)果。在調(diào)用 join() 方法之前,程序會(huì)阻塞當(dāng)前線程,直到子任務(wù)的執(zhí)行完成。如果子任務(wù)還沒有完成,則當(dāng)前線程會(huì)暫停執(zhí)行,轉(zhuǎn)而執(zhí)行其他可執(zhí)行任務(wù),從而實(shí)現(xiàn)工作竊取的效果。
  • invoke() 方法:invoke() 方法用于提交一個(gè)任務(wù)給 Fork/Join 框架進(jìn)行處理,并返回任務(wù)的執(zhí)行結(jié)果。該方法會(huì)同步地啟動(dòng)一個(gè)任務(wù),并阻塞當(dāng)前線程,直到任務(wù)執(zhí)行完成并返回結(jié)果。這個(gè)方法通常用于提交根任務(wù)或最頂層的任務(wù)。
  • RecursiveTask 類和 RecursiveAction 類:Fork/Join 框架提供了兩個(gè)抽象類 RecursiveTask 和 RecursiveAction,用于定義可分解的任務(wù)。RecursiveTask 適用于需要返回結(jié)果的任務(wù),而 RecursiveAction 適用于不需要返回結(jié)果的任務(wù)。這兩個(gè)類都有一個(gè)抽象方法 compute(),我們需要在子類中實(shí)現(xiàn)該方法來定義具體的任務(wù)邏輯。
  • Work-Stealing(工作竊?。篎ork/Join 框架采用了工作竊取算法,使得線程在處理完自己的任務(wù)后可以從其他線程的隊(duì)列中偷取任務(wù)來執(zhí)行。這種方式可以提高并行計(jì)算的效率和負(fù)載均衡性能。工作竊取是通過雙端隊(duì)列實(shí)現(xiàn)的,每個(gè)線程都有自己的任務(wù)隊(duì)列,當(dāng)一個(gè)線程完成自己隊(duì)列中的任務(wù)后,它會(huì)嘗試從其他線程的隊(duì)列末尾竊取任務(wù)來執(zhí)行。

這些方法和概念是 Fork/Join 框架中非常重要的部分,它們通過任務(wù)的分解、合并和工作竊取機(jī)制,實(shí)現(xiàn)了高效的并行計(jì)算。理解并熟練使用這些方法可以幫助開發(fā)者更好地利用 Fork/Join 框架來處理并行計(jì)算任務(wù)。

??代碼實(shí)現(xiàn)

ForkjoinDemo.java

package org.Test6;

import java.util.concurrent.RecursiveTask;

public class ForkjoinDemo extends RecursiveTask<Long> {
    private Long start; // 1
    private Long end; // 1990900000
    // 臨界值
    private Long temp = 10000L;

    public ForkjoinDemo(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    // 計(jì)算方法
    @Override
    protected Long compute() {
        if ((end - start) < temp) {
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        } else { // forkjoin 遞歸
            long middle = (start + end) / 2; // 中間值
            ForkjoinDemo task1 = new ForkjoinDemo(start, middle);
            task1.fork(); // 拆分任務(wù),把任務(wù)壓入線程隊(duì)列
            ForkjoinDemo task2 = new ForkjoinDemo(middle + 1, end);
            task2.fork(); // 拆分任務(wù),把任務(wù)壓入線程隊(duì)列
            return task1.join() + task2.join();
        }
    }
}

Test.java

package org.Test6;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

public class Test {

    public static void test1() {
        Long sum = 0L;
        long start = System.currentTimeMillis();
        for (Long i = 1L; i <= 10_0000_0000; i++) {
            sum += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("sum=" + sum + " 時(shí)間:" + (end - start));
    }

    // 會(huì)使用ForkJoin
    public static void test2() throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Long> task = new ForkjoinDemo(0L, 10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(task);// 提交任務(wù)
        Long sum = submit.get();
        long end = System.currentTimeMillis();
        System.out.println("sum=" + sum + " 時(shí)間:" + (end - start));
    }

    public static void test3() {
        long start = System.currentTimeMillis();
        // Stream并行流
        long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
        long end = System.currentTimeMillis();

        System.out.println("sum=" + sum + " 時(shí)間:" + (end - start));
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        test1();
        test2();
        test3();
    }

}

【并發(fā)編程篇】詳解Forkjoin,并發(fā)編程,python,java,開發(fā)語言

在技術(shù)的道路上,我們不斷探索、不斷前行,不斷面對挑戰(zhàn)、不斷突破自我??萍嫉陌l(fā)展改變著世界,而我們作為技術(shù)人員,也在這個(gè)過程中書寫著自己的篇章。讓我們攜手并進(jìn),共同努力,開創(chuàng)美好的未來!愿我們在科技的征途上不斷奮進(jìn),創(chuàng)造出更加美好、更加智能的明天!

【并發(fā)編程篇】詳解Forkjoin,并發(fā)編程,python,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-795993.html

到了這里,關(guān)于【并發(fā)編程篇】詳解Forkjoin的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java并發(fā)編程:ArrayBlockingQueue詳解

    java并發(fā)編程:ArrayBlockingQueue詳解

    ArrayBlockingQueue 顧名思義:基于數(shù)組的阻塞隊(duì)列。數(shù)組是要指定長度的,所以使用 ArrayBlockingQueue 時(shí)必須指定長度,也就是它是一個(gè)有界隊(duì)列。它實(shí)現(xiàn)了 BlockingQueue 接口,有著隊(duì)列、集合以及阻塞隊(duì)列的所有方法。 ArrayBlockingQueue 是線程安全的,內(nèi)部使用 ReentrantLock 來保證。A

    2024年02月08日
    瀏覽(30)
  • java并發(fā)編程:LinkedBlockingQueue詳解

    java并發(fā)編程:LinkedBlockingQueue詳解

    在集合框架里,想必大家都用過ArrayList和LinkedList,也經(jīng)常在面試中問到他們之間的區(qū)別。ArrayList和ArrayBlockingQueue一樣,內(nèi)部基于數(shù)組來存放元素,而LinkedBlockingQueue則和LinkedList一樣,內(nèi)部基于鏈表來存放元素。 LinkedBlockingQueue實(shí)現(xiàn)了BlockingQueue接口,這里放一張類的繼承關(guān)系圖

    2024年02月08日
    瀏覽(64)
  • Java并發(fā)編程詳解:實(shí)現(xiàn)高效并發(fā)應(yīng)用的關(guān)鍵技術(shù)

    在當(dāng)前的計(jì)算機(jī)領(lǐng)域,高效的并發(fā)編程對于Java開發(fā)人員而言變得越發(fā)重要。作為流行的編程語言,Java提供了強(qiáng)大的并發(fā)編程支持,使開發(fā)人員能夠充分發(fā)揮多核處理器和線程的潛力,構(gòu)建高性能、高吞吐量的應(yīng)用程序。本文將深入探討Java并發(fā)編程的關(guān)鍵技術(shù),包括線程安全

    2024年02月13日
    瀏覽(30)
  • Java并發(fā)編程之線程池詳解

    Java并發(fā)編程之線程池詳解

    目錄 ??今日良言:不悲傷 不彷徨 有風(fēng)聽風(fēng) 有雨看雨 ??一、簡介 ??二、相關(guān)代碼 ??1.線程池代碼 ??2.自定義實(shí)現(xiàn)線程池 ??三、ThreadPoolExecutor類 首先來介紹一下什么是線程池,線程池是一種利用池化技術(shù)思想來實(shí)現(xiàn)的線程管理技術(shù),主要是為了復(fù)用線程、便利地管理線程

    2024年02月12日
    瀏覽(24)
  • 【java】開發(fā)——《并發(fā)編程》

    【java】開發(fā)——《并發(fā)編程》

    目錄 一.jmm 二.并發(fā)了什么 1.只有一個(gè)核(單核)并發(fā)還有沒有意義 2.單核,還有什么可見性問題 3.并發(fā)和并行 三.volitaile 1.變量的可見性問題 2.原因是什么 3.本次修改的變量直接刷到主內(nèi)存 4.聲明其他內(nèi)存對于這個(gè)地址的緩存無效 四.happens-befo 1.順序性問題 五.volitaile+cas 1.原

    2024年02月22日
    瀏覽(26)
  • 【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    存在共享數(shù)據(jù); 多線程共同操作共享數(shù)。 synchronized 可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí) synchronized 可以保證一個(gè)線程的變化可見(可見性),即可以代替 volatile。 多線程編程中,有可能會(huì)出現(xiàn)多個(gè)線程同時(shí)訪問同一個(gè)共享、可變

    2024年02月02日
    瀏覽(24)
  • 【Java 并發(fā)編程】Java 線程本地變量 ThreadLocal 詳解

    【Java 并發(fā)編程】Java 線程本地變量 ThreadLocal 詳解

    先一起看一下 ThreadLocal 類的官方解釋: 用大白話翻譯過來,大體的意思是: ThreadLoal 提供給了 線程局部變量 。同一個(gè) ThreadLocal 所包含的對象,在不同的 Thread 中有不同的副本。這里有幾點(diǎn)需要注意: 因?yàn)槊總€(gè) Thread 內(nèi)有自己的實(shí)例副本,且 該副本只能由當(dāng)前 Thread 使用 。

    2024年02月04日
    瀏覽(31)
  • java并發(fā)編程 AbstractQueuedSynchronizer(AQS)詳解一

    AQS在類的注釋上說的已經(jīng)很明白,提供一個(gè)框架,用于實(shí)現(xiàn)依賴先進(jìn)先出(FIFO)等待隊(duì)列的阻塞鎖和相關(guān)同步器(信號量、事件等)。此類被設(shè)計(jì)做為大多數(shù)類型的同步器的一個(gè)有用的基礎(chǔ)類,這些同步器依賴于單個(gè)原子int值(state字段)來表示狀態(tài)。 java 并發(fā)編程系列文章

    2024年02月10日
    瀏覽(21)
  • Java并發(fā)編程第6講——線程池(萬字詳解)

    Java并發(fā)編程第6講——線程池(萬字詳解)

    Java中的線程池是運(yùn)用場景最多的并發(fā)框架,幾乎所有需要異步或并發(fā)執(zhí)行任務(wù)的程序都可以使用線程池,本篇文章就詳細(xì)介紹一下。 定義:線程池是一種用于管理和重用線程的技術(shù)(池化技術(shù)),它主要用于提高多線程應(yīng)用程序的性能和效率。 ps:線程池、連接池、內(nèi)存池

    2024年02月11日
    瀏覽(27)
  • 【100天精通python】Day25:python的編程方式以及并發(fā)編程詳解

    目錄 ?專欄導(dǎo)讀? 1 python的編程方式 2 順序編程 3 面向?qū)ο缶幊?/p>

    2024年02月14日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包