欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解

 更新時(shí)間:2021年11月16日 10:34:02   作者:張起靈-小哥  
本文主要介紹了 Java 多線程高并發(fā)中的 Fork/Join 框架的基本原理和其使用的工作竊取算法(work-stealing)、設(shè)計(jì)方式和部分實(shí)現(xiàn)源碼,感興趣的朋友跟隨小編一起看看吧

1.Fork/Join框架簡(jiǎn)介

Fork/Join 它可以將一個(gè)大的任務(wù)拆分成多個(gè)子任務(wù)進(jìn)行并行處理,最后將子任務(wù)結(jié)果合并成最后的計(jì)算結(jié)果,并進(jìn)行輸出。Fork/Join 框架要完成兩件事情:

Fork:把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小 :把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小

Join:把分拆任務(wù)的結(jié)果進(jìn)行合并

在 Java 的 Fork/Join 框架中,使用兩個(gè)類完成上述操作:

ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要?jiǎng)?chuàng)建一個(gè) ForkJoin 任務(wù)。該類提供了在任務(wù)中執(zhí)行 fork 和 join 的機(jī)制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,F(xiàn)ork/Join 框架提供了兩個(gè)子類:

  • RecursiveAction:用于沒有返回結(jié)果的任務(wù)
  • RecursiveTask:用于有返回結(jié)果的任務(wù)

ForkJoinPool: ForkJoinTask 需要通過 ForkJoinPool 來執(zhí)行。

RecursiveTask: 繼承后可以實(shí)現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務(wù)。

可以在jdk官方文檔中看到:

2.簡(jiǎn)單應(yīng)用

實(shí)現(xiàn)從 1 + 2 + ... + 100 ,將它們拆分成多個(gè)小任務(wù),分別求和,最終再將這些結(jié)果合并。

這里就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然后定義有參構(gòu)造,而ForkJoinTask需要通過 ForkJoinPool 來執(zhí)行,所以還需要?jiǎng)?chuàng)建 分支合并池ForkJoinPool對(duì)象。

package test.forkjoin;
 
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
 
/**
 *
 */
class MyTask extends RecursiveTask<Integer> {
    //拆分差值不能超過10,每次計(jì)算10以內(nèi)的連加操作
    private static final Integer NUMBER = 10;
    private int begin; //拆分左區(qū)間的值
    private int end; //拆分右區(qū)間的值
    private int result; //最終結(jié)果
 
    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }
 
    @Override
    protected Integer compute() {
        //判斷區(qū)間差值是否大于10
        if ((end - begin) <= NUMBER) {
            //將區(qū)間內(nèi)的值依次相加
            for (int i = begin; i <= end; i++) {
                result += i;
            }
        } else { //區(qū)間差值大于10,進(jìn)一步拆分
            //獲取中間值
            int middle = (begin + end) / 2;
            //拆分的左區(qū)間
            MyTask taskLeft = new MyTask(begin,middle);
            //拆分的右區(qū)間
            MyTask taskRight = new MyTask(middle + 1,end);
            //fork方法進(jìn)行拆分
            taskLeft.fork();
            taskRight.fork();
            //join方法進(jìn)行合并
            result = taskLeft.join() + taskRight.join();
        }
        return result;
    }
}
 
public class ForkJoinDemo {
    public static void main(String[] args) {
        //創(chuàng)建MyTask對(duì)象
        MyTask myTask = new MyTask(1,100);
        //創(chuàng)建分支合并池對(duì)象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        try {
            //獲取最終合并后的結(jié)果
            Integer ans = forkJoinTask.get();
            System.out.println(ans);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //關(guān)閉池對(duì)象
            forkJoinPool.shutdown();
        }
    }
}

到此這篇關(guān)于Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java Fork/Join 框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能

    SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能

    本文介紹SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預(yù)覽時(shí)會(huì)在同級(jí)目錄下創(chuàng)建一個(gè)相同文件名后綴為pdf的文件,每次預(yù)覽會(huì)先查找文件是否存在,存在則直接預(yù)覽,不存在則會(huì)走上面的處理,需要的朋友可以參考下
    2022-02-02
  • Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程

    Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn),需要的朋友可以參考下
    2022-06-06
  • JVM加載class文件的原理機(jī)制實(shí)例詳解

    JVM加載class文件的原理機(jī)制實(shí)例詳解

    Java是一種具有動(dòng)態(tài)性的解釋型語言,類(class)只有被加載到JVM后才能運(yùn)行,接下來通過本文給大家介紹JVM加載class文件的原理機(jī)制詳解,感興趣的朋友一起看看吧
    2022-04-04
  • Java超詳細(xì)透徹講解接口

    Java超詳細(xì)透徹講解接口

    接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java接口,感興趣的朋友一起看看吧
    2022-05-05
  • SpringBoot實(shí)現(xiàn)自定義條件注解的代碼示例

    SpringBoot實(shí)現(xiàn)自定義條件注解的代碼示例

    在Spring Boot中,條件注解是一種非常強(qiáng)大的工具,它可以根據(jù)特定的條件來選擇是否加載某個(gè)類或某個(gè)Bean,文將介紹如何在Spring Boot中實(shí)現(xiàn)自定義條件注解,并提供一個(gè)示例代碼,需要的朋友可以參考下
    2023-06-06
  • 深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用

    深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用

    Spring事務(wù)管理機(jī)制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級(jí)別,保證數(shù)據(jù)一致性和完整性。在實(shí)際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場(chǎng)景選擇合適的傳播行為實(shí)現(xiàn)事務(wù)控制
    2023-04-04
  • 詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁查詢的顯示問題,針對(duì)于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:
    2016-06-06
  • mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼

    mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼

    這篇文章主要介紹了mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳

    SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳

    MultipartResolver 用于處理文件上傳,當(dāng)收到請(qǐng)求時(shí) DispatcherServlet 的 checkMultipart() 方法會(huì)調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請(qǐng)求中是否包含文件
    2023-02-02
  • JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解

    JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解

    這篇文章主要介紹了JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解,Tomcat是一個(gè)開源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機(jī)制和Servlet運(yùn)行原理的簡(jiǎn)要說明,需要的朋友可以參考下
    2023-10-10

最新評(píng)論