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

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

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

1.Fork/Join框架簡介

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

Fork:把一個復雜任務(wù)進行分拆,大事化小 :把一個復雜任務(wù)進行分拆,大事化小

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

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

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

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

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

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

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

2.簡單應(yīng)用

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

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

package test.forkjoin;
 
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
 
/**
 *
 */
class MyTask extends RecursiveTask<Integer> {
    //拆分差值不能超過10,每次計算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,進一步拆分
            //獲取中間值
            int middle = (begin + end) / 2;
            //拆分的左區(qū)間
            MyTask taskLeft = new MyTask(begin,middle);
            //拆分的右區(qū)間
            MyTask taskRight = new MyTask(middle + 1,end);
            //fork方法進行拆分
            taskLeft.fork();
            taskRight.fork();
            //join方法進行合并
            result = taskLeft.join() + taskRight.join();
        }
        return result;
    }
}
 
public class ForkJoinDemo {
    public static void main(String[] args) {
        //創(chuàng)建MyTask對象
        MyTask myTask = new MyTask(1,100);
        //創(chuàng)建分支合并池對象
        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)閉池對象
            forkJoinPool.shutdown();
        }
    }
}

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

相關(guān)文章

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

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

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

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

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

    JVM加載class文件的原理機制實例詳解

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

    Java超詳細透徹講解接口

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

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

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

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

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

    詳解Java的MyBatis框架中的緩存與緩存的使用改進

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

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

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

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

    MultipartResolver 用于處理文件上傳,當收到請求時 DispatcherServlet 的 checkMultipart() 方法會調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件
    2023-02-02
  • JavaWeb中Tomcat底層機制和Servlet運行原理詳解

    JavaWeb中Tomcat底層機制和Servlet運行原理詳解

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

最新評論