最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?并發(fā)編程之ForkJoin框架

 更新時(shí)間:2021年11月22日 16:40:18   作者:smileNicky  
這篇文章主要為大家介紹了Java?ForkJoin框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助

1、什么是ForkJoin框架

ForkJoin框架是java的JUC包里提供的,用于處理一些比較繁重的任務(wù),會(huì)將這個(gè)大任務(wù)分為多個(gè)小任務(wù),多個(gè)小任務(wù)處理完成后會(huì)將結(jié)果匯總給Result,體現(xiàn)的是一種“分而治之”的思想。第一步,拆分fork任務(wù),將大任務(wù)分為多個(gè)小任務(wù);第二步,歸并join,會(huì)將小任務(wù)的處理結(jié)果進(jìn)行歸并為一個(gè)結(jié)果。

在這里插入圖片描述

2、ForkJoinTask

ForkJoinTask是ForkJoin框架的提供的任務(wù)API,F(xiàn)orkJoinTask是一個(gè)抽象類(lèi),有兩個(gè)主要的實(shí)現(xiàn)類(lèi),RecursiveTask和RecursiveAction,其中RecursiveTask和RecursiveAction的主要區(qū)別是,RecursiveAction沒(méi)有返回值,而RecursiveTask是有返回值的

在這里插入圖片描述

3、ForkJoinPool

ForkJoinPool類(lèi)是forkjoin框架的線(xiàn)程池實(shí)現(xiàn),基于ExecutorService接口。這個(gè)線(xiàn)程池是jdk1.7才加入的,用于管理線(xiàn)程,執(zhí)行forkjoin的任務(wù)。對(duì)于線(xiàn)程池的使用,我們使用ThreadPoolExecutor比較多,可以在idea里看一下uml類(lèi)圖,可以看出ForkJoinPool和ThreadPoolExecutor實(shí)現(xiàn)差不多的。

在這里插入圖片描述

ForkJoinPool()
ForkJoinPool(int parallelism)
ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory,
 UncaughtExceptionHandler handler, boolean asyncMode)

幾個(gè)重要的參數(shù):

  • parallelism:并行度,并行執(zhí)行線(xiàn)程,可用指定,也可以不指定,不指定的情況,是根據(jù)cpu核數(shù)創(chuàng)建可用的線(xiàn)程
  • ForkJoinWorkerThreadFactory:創(chuàng)建線(xiàn)程的工廠(chǎng)實(shí)現(xiàn)
  • UncaughtExceptionHandler :因?yàn)槲粗惓V袛嗟幕卣{(diào)處理
  • asyncMode:是否異步,默認(rèn)情況是false

使用時(shí)候,可以直接創(chuàng)建ForkJoinPool,可以不傳參,不傳參的情況,默認(rèn)指定的線(xiàn)程并行數(shù)為Runtime.getRunTime().availableProcessors();,表示根據(jù)cpu核數(shù)創(chuàng)建可用線(xiàn)程數(shù)

ForkJoinPool forkJoinPool = new ForkJoinPool();
ArraySortTask task = new ArraySortTask(array , 0 , size);
forkJoinPool.submit(task);
task.get();

也是可用傳參,對(duì)并行度進(jìn)行指定的public ForkJoinPool(int parallelism), parallelism并行度,并行執(zhí)行幾個(gè)線(xiàn)程

將forkjoin任務(wù)加入到FrokJoinPool線(xiàn)程池有幾種方式

  • execute():調(diào)用其 fork 方法在多個(gè)線(xiàn)程之間拆分工作。
  • invoke():在ForkJoinPool線(xiàn)程池上調(diào)用invoke方法
  • submit():返回一個(gè)Future對(duì)象,F(xiàn)uture可以進(jìn)行監(jiān)控,任務(wù)完成后返回結(jié)果

4、打印斐波那契數(shù)列

ForkJoin框架可以用于一些遞歸遍歷的場(chǎng)景,對(duì)于斐波那契數(shù)列,你可以比較熟悉,因?yàn)樵诿嬖囍杏袝r(shí)候經(jīng)常問(wèn)到,斐波那契數(shù)列的特點(diǎn)就是最后一項(xiàng)的結(jié)果等于前面兩項(xiàng)的和

package com.example.concurrent.forkjoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
 * <pre>
 *      斐波那契數(shù)列
 * </pre>
 * <p>
 * <pre>
 * @author nicky.ma
 * 修改記錄
 *    修改后版本:     修改人:  修改日期: 2021/10/12 16:22  修改內(nèi)容:
 * </pre>
 */
public class Fibonacci extends RecursiveTask<Integer>{
    private int n;
    public Fibonacci(int n) {
        this.n = n;
    }
    @Override
    protected Integer compute() {
        if (n <= 1)
            return n;
        Fibonacci f1 = new Fibonacci(n - 1);
        f1.fork();
        Fibonacci f2 = new Fibonacci(n - 2);
        f2.fork();
        return f1.join() + f2.join();
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ForkJoinPool pool = new ForkJoinPool();
        for (int i = 0; i< 10; i++) {
            ForkJoinTask task = pool.submit(new Fibonacci(i));
            System.out.println(task.get());
        }
    }
}

5、ForkJoin歸并排序

面試題:快速實(shí)現(xiàn)對(duì)一個(gè)長(zhǎng)度百萬(wàn)的數(shù)組的排序

難點(diǎn):可以使用歸并排序,多線(xiàn)程如何組織實(shí)現(xiàn)歸并排序

package com.example.concurrent.forkjoin;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
/**
 * <pre>
 *      大數(shù)組排序
 * </pre>
 * <p>
 * <pre>
 * @author mazq
 * 修改記錄
 *    修改后版本:     修改人:  修改日期: 2021/10/12 17:04  修改內(nèi)容:
 * </pre>
 */
public class ArraySortTask extends RecursiveAction{
    final long[] array; final int lo, hi;
    ArraySortTask(long[] array, int lo, int hi) {
        this.array = array; this.lo = lo; this.hi = hi;
    }
    ArraySortTask(long[] array) { this(array, 0, array.length); }
    @Override
    protected void compute() {
        if (hi - lo < THRESHOLD)
            // 少于閥值,使用Arrays.sort 快排
            sortSequentially(lo, hi);
        else {
            /* 歸并排序 */
            // 取中間值
            int mid = (lo + hi) >>> 1;
            // 拆分任務(wù)
            invokeAll(new ArraySortTask(array, lo, mid),
                    new ArraySortTask(array, mid, hi));
            // 歸并結(jié)果
            merge(lo, mid, hi);
        }
    }
    // implementation details follow:
    static final int THRESHOLD = 1000;
    void sortSequentially(int lo, int hi) {
        Arrays.sort(array, lo, hi);
    }
    void merge(int lo, int mid, int hi) {
        long[] buf = Arrays.copyOfRange(array, lo, mid);
        for (int i = 0, j = lo, k = mid; i < buf.length; j++)
            array[j] = (k == hi || buf[i] < array[k]) ?
                    buf[i++] : array[k++];
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        int size = 10_000;
        long[] array = new long[size];
        Random random = new Random();
        for (int i = 0; i< size; i++) {
            array[i] = random.nextInt();
        }
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ArraySortTask task = new ArraySortTask(array , 0 , size);
        forkJoinPool.submit(task);
        task.get();
        for (long a : array) {
            System.out.println(a);
        }
    }
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java開(kāi)發(fā)中為什么雙重效驗(yàn)鎖要加volatile

    java開(kāi)發(fā)中為什么雙重效驗(yàn)鎖要加volatile

    這篇文章主要為大家介紹了java開(kāi)發(fā)中為什么雙重效驗(yàn)鎖要加volatile原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • spring強(qiáng)行注入和引用實(shí)例解析

    spring強(qiáng)行注入和引用實(shí)例解析

    這篇文章主要介紹了spring強(qiáng)行注入和引用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java從控制臺(tái)讀入數(shù)據(jù)的幾種方法總結(jié)

    Java從控制臺(tái)讀入數(shù)據(jù)的幾種方法總結(jié)

    下面小編就為大家?guī)?lái)一篇Java從控制臺(tái)讀入數(shù)據(jù)的幾種方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • java使用HashMap實(shí)現(xiàn)斗地主(有序版)

    java使用HashMap實(shí)現(xiàn)斗地主(有序版)

    這篇文章主要為大家詳細(xì)介紹了java使用ArrayList實(shí)現(xiàn)斗地主游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java連接MySQL8.0 JDBC的詳細(xì)步驟(IDEA版本)

    Java連接MySQL8.0 JDBC的詳細(xì)步驟(IDEA版本)

    這篇文章主要介紹了Java連接MySQL8.0 JDBC的詳細(xì)步驟(IDEA版本),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • IDEA自定義Maven倉(cāng)庫(kù)的實(shí)現(xiàn)

    IDEA自定義Maven倉(cāng)庫(kù)的實(shí)現(xiàn)

    使用Maven進(jìn)行Java程序開(kāi)發(fā)時(shí),開(kāi)發(fā)者能夠極大地提高開(kāi)發(fā)效率,本文主要介紹了IDEA自定義Maven倉(cāng)庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 詳解JavaSE實(shí)現(xiàn)IoC

    詳解JavaSE實(shí)現(xiàn)IoC

    簡(jiǎn)單地說(shuō),IoC 是反轉(zhuǎn)控制,類(lèi)似于好萊塢原則,主要有依賴(lài)查找和依賴(lài)注入實(shí)現(xiàn)。依賴(lài)查找是主動(dòng)或手動(dòng)的依賴(lài)查找方式,通常需要依賴(lài)容器或標(biāo)準(zhǔn)API實(shí)現(xiàn)。 而依賴(lài)注入則是手動(dòng)或自動(dòng)依賴(lài)綁定的方式,無(wú)需依賴(lài)特定的容器和API。本文將詳細(xì)介紹JavaSE實(shí)現(xiàn)IoC。
    2021-06-06
  • SpringMVC如何用Post方式重定向

    SpringMVC如何用Post方式重定向

    這篇文章主要介紹了SpringMVC如何用Post方式重定向,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Springboot中的默認(rèn)日志框架配置詳解

    Springboot中的默認(rèn)日志框架配置詳解

    這篇文章主要介紹了Springboot中的默認(rèn)日志框架配置詳解,spring boot日志默認(rèn)會(huì)輸出到控制臺(tái),所以并不需要我們做過(guò)多配置,但不過(guò)不喜歡控制臺(tái)默認(rèn)日志格式,則可以使用logging.pattern.console屬性配置,需要的朋友可以參考下
    2023-09-09
  • Seata?AT模式TM處理流程圖文示例詳解

    Seata?AT模式TM處理流程圖文示例詳解

    這篇文章主要為大家介紹了Seata?AT模式TM處理流程圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

伊宁市| 广宁县| 海丰县| 桦南县| 德钦县| 台中市| 台安县| 通化市| 芒康县| 神木县| 中西区| 景东| 伊金霍洛旗| 嘉兴市| 太湖县| 高平市| 永福县| 阿城市| 乌拉特后旗| 梅州市| 巴林右旗| 托克托县| 德钦县| 诏安县| 娄烦县| 通化市| 天台县| 建水县| 壶关县| 高阳县| 盐城市| 新郑市| 肥西县| 深圳市| 蕲春县| 靖西县| 商水县| 烟台市| 赤水市| 沙坪坝区| 银川市|