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

Java并行處理的實(shí)現(xiàn)

 更新時(shí)間:2021年07月14日 11:54:26   作者:張?jiān)骑wVir  
并行計(jì)算一般是指許多指令得以同時(shí)進(jìn)行的計(jì)算模式。本文主要介紹了Java并行處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1. 背景

本文是一個(gè)短文章,介紹Java 中的并行處理。
說(shuō)明:10多分鐘讀完的文章我稱之為短文章,適合快速閱讀。

2.知識(shí)

并行計(jì)算(parallel computing)一般是指許多指令得以同時(shí)進(jìn)行的計(jì)算模式。在同時(shí)進(jìn)行的前提下,可以將計(jì)算的過(guò)程分解成小部分,之后以并發(fā)方式來(lái)加以解決。

也就是分解為幾個(gè)過(guò)程:

1、將一個(gè)大任務(wù)拆分成多個(gè)子任務(wù),子任務(wù)還可以繼續(xù)拆分。
2、各個(gè)子任務(wù)同時(shí)進(jìn)行運(yùn)算執(zhí)行。
3、在執(zhí)行完畢后,可能會(huì)有個(gè) " 歸納 " 的任務(wù),比如 求和,求平均等。

再簡(jiǎn)化一點(diǎn)的理解就是: 先拆分  -->  在同時(shí)進(jìn)行計(jì)算  --> 最后“歸納”
為什么要“并行”,優(yōu)點(diǎn)呢?

1、為了獲得 “節(jié)省時(shí)間”,“快”。適合用于大規(guī)模運(yùn)算的場(chǎng)景。從理論上講,在 n 個(gè)并行處理的執(zhí)行速度可能會(huì)是在單一處理機(jī)上執(zhí)行的速度的 n 倍。
2、以前的計(jì)算機(jī)是單核的,現(xiàn)代的計(jì)算機(jī)Cpu都是多核的,服務(wù)器甚至都是多Cpu的,并行計(jì)算可以充分利用硬件的性能。

3. Java 中的并行處理

JDK 8 新增的Stream API(java.util.stream)將生成環(huán)境的函數(shù)式編程引入了Java庫(kù)中,可以方便開(kāi)發(fā)者能夠?qū)懗龈佑行А⒏雍?jiǎn)潔的代碼。

steam 的另一個(gè)價(jià)值是創(chuàng)造性地支持并行處理(parallel processing)。示例:

final Collection< Task > tasks = Arrays.asList(
    new Task( Status.OPEN, 5 ),
    new Task( Status.OPEN, 13 ),
    new Task( Status.CLOSED, 8 ) 
);

// 并行執(zhí)行多個(gè)任務(wù),并 求和
final double totalPoints = tasks
   .stream()
   .parallel()
   .map( task -> task.getPoints() ) // or map( Task::getPoints ) 
   .reduce( 0, Integer::sum );
 
System.out.println( "Total points (all tasks): " + totalPoints );

對(duì)于上面的tasks集合,上面的代碼計(jì)算所有任務(wù)的點(diǎn)數(shù)之和。
它使用 parallel 方法并行處理所有的task,并使用 reduce 方法計(jì)算最終的結(jié)果。

4. 擴(kuò)展

線程池方式實(shí)現(xiàn)并行處理

jdk1.5引入了并發(fā)包,其中包括了ThreadPoolExecutor,相關(guān)代碼如下:

public class ExecutorServiceTest {
 
    public static final int THRESHOLD = 10_000;
    public static long[] numbers;
 
    public static void main(String[] args) throws Exception {
        numbers = LongStream.rangeClosed(1, 10_000_000).toArray();
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
        CompletionService<Long> completionService = new ExecutorCompletionService<Long>(executor);
        int taskSize = (int) (numbers.length / THRESHOLD);
        for (int i = 1; i <= taskSize; i++) {
            final int key = i;
            completionService.submit(new Callable<Long>() {
 
                @Override
                public Long call() throws Exception {
                    return sum((key - 1) * THRESHOLD, key * THRESHOLD);
                }
            });
        }
        long sumValue = 0;
        for (int i = 0; i < taskSize; i++) {
            sumValue += completionService.take().get();
        }
        // 所有任務(wù)已經(jīng)完成,關(guān)閉線程池
        System.out.println("sumValue = " + sumValue);
        executor.shutdown();
    }
 
    private static long sum(int start, int end) {
        long sum = 0;
        for (int i = start; i < end; i++) {
            sum += numbers[i];
        }
        return sum;
    }
}

使用 fork/join框架

分支/合并框架的目的是以遞歸的方式將可以并行的認(rèn)為拆分成更小的任務(wù),然后將每個(gè)子任務(wù)的結(jié)果合并起來(lái)生成整體結(jié)果;相關(guān)代碼如下:

public class ForkJoinTest extends java.util.concurrent.RecursiveTask<Long> {
    
    private static final long serialVersionUID = 1L;
    private final long[] numbers;
    private final int start;
    private final int end;
    public static final long THRESHOLD = 10_000;
 
    public ForkJoinTest(long[] numbers) {
        this(numbers, 0, numbers.length);
    }
 
    private ForkJoinTest(long[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }
 
    @Override
    protected Long compute() {
        int length = end - start;
        if (length <= THRESHOLD) {
            return computeSequentially();
        }
        ForkJoinTest leftTask = new ForkJoinTest(numbers, start, start + length / 2);
        leftTask.fork();
        ForkJoinTest rightTask = new ForkJoinTest(numbers, start + length / 2, end);
        Long rightResult = rightTask.compute();
        // 注:join方法會(huì)阻塞,因此有必要在兩個(gè)子任務(wù)的計(jì)算都開(kāi)始之后才執(zhí)行join方法
        Long leftResult = leftTask.join();
        return leftResult + rightResult;
    }
 
    private long computeSequentially() {
        long sum = 0;
        for (int i = start; i < end; i++) {
            sum += numbers[i];
        }
        return sum;
    }
 
    public static void main(String[] args) {
        System.out.println(forkJoinSum(10_000_000));
    }
 
    public static long forkJoinSum(long n) {
        long[] numbers = LongStream.rangeClosed(1, n).toArray();
        ForkJoinTask<Long> task = new ForkJoinTest(numbers);
        return new ForkJoinPool().invoke(task);
    }
}

上面的代碼實(shí)現(xiàn)了 遞歸方式拆分子任務(wù),并放入到線程池中執(zhí)行。

5.參考:

https://zh.wikipedia.org/wiki/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97

到此這篇關(guān)于Java并行處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java并行處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis3源碼解析之如何獲取數(shù)據(jù)源詳解

    MyBatis3源碼解析之如何獲取數(shù)據(jù)源詳解

    用myBatis3與spring整合的時(shí)候,我們可以通過(guò)多種方式獲取數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于MyBatis3源碼解析之如何獲取數(shù)據(jù)源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java 中引入內(nèi)部類的意義?

    Java 中引入內(nèi)部類的意義?

    這篇文章主要介紹了Java 中引入內(nèi)部類的意義?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Java插入修改刪除數(shù)據(jù)庫(kù)數(shù)據(jù)的基本方法

    Java插入修改刪除數(shù)據(jù)庫(kù)數(shù)據(jù)的基本方法

    這篇文章主要介紹了Java插入修改刪除數(shù)據(jù)庫(kù)數(shù)據(jù)的基本方法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • java開(kāi)發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗(yàn)方式

    java開(kāi)發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗(yàn)方式

    這篇文章主要介紹了java開(kāi)發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗(yàn)方式,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下
    2021-09-09
  • Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄

    Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄

    這篇文章主要介紹了Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot整合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能

    SpringBoot整合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄

    Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄

    這篇文章主要介紹了Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 一文詳解Java如何實(shí)現(xiàn)自定義注解

    一文詳解Java如何實(shí)現(xiàn)自定義注解

    Java實(shí)現(xiàn)自定義注解其實(shí)很簡(jiǎn)單,跟類定義差不多,只是屬性的定義可能跟我們平時(shí)定義的屬性略有不同,這篇文章主要給大家介紹了關(guān)于Java如何實(shí)現(xiàn)自定義注解的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java groovy內(nèi)存回收測(cè)試步驟解析

    Java groovy內(nèi)存回收測(cè)試步驟解析

    這篇文章主要介紹了Java groovy內(nèi)存回收測(cè)試步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • JAVA面向?qū)ο笾^承?super入門(mén)解析

    JAVA面向?qū)ο笾^承?super入門(mén)解析

    在JAVA類中使用super來(lái)引用父類的成分,用this來(lái)引用當(dāng)前對(duì)象,如果一個(gè)類從另外一個(gè)類繼承,我們new這個(gè)子類的實(shí)例對(duì)象的時(shí)候,這個(gè)子類對(duì)象里面會(huì)有一個(gè)父類對(duì)象。怎么引用里面的父類對(duì)象呢?用super來(lái)引用,this指當(dāng)前對(duì)象的引用,super是當(dāng)前對(duì)象里面的父對(duì)象的引用
    2022-01-01

最新評(píng)論

习水县| 汪清县| 综艺| 怀宁县| 双辽市| 峨边| 临朐县| 白河县| 砀山县| 当雄县| 舟山市| 石门县| 石阡县| 苍山县| 高唐县| 金溪县| 淅川县| 龙岩市| 芜湖市| 安仁县| 磐安县| 永康市| 炉霍县| 阳泉市| 五峰| 通渭县| 沙雅县| 宝鸡市| 太原市| 新和县| 长子县| 盱眙县| 四子王旗| 滦平县| 通渭县| 凌源市| 布拖县| 嵊州市| 南澳县| 伊通| 永昌县|