首页 > 编程语言 >JUC并发编程学习(十三)ForkJoin

JUC并发编程学习(十三)ForkJoin

时间:2023-11-06 13:11:50浏览次数:34  
标签:JUC 编程 System Long ForkJoinTask start ForkJoin public

ForkJoin

什么是ForkJoin

ForkJoin在JDK1.7,并发执行任务!大数据量时提高效率。

大数据:Map Reduce(把大任务拆分成小任务)

ForkJoin特点:工作窃取

为什么可以取窃取其他线程的任务呢?因为这里面维护的都是双端队列(即队列的两端都可以取元素)

ForkJoin操作

在java.util.concurrent下的接口摘要中,有以下两个接口

点进其中一个找到具体的类,可以看到ForkJoinPool

这是具体的执行类,就像ThreadPoolExecutor

具体的执行通过ForkJoinTask类来执行

使用ForkJoin

1、需要一个ForkJoinPool,通过execute方法来执行,参数为ForkJoinTask

2、计算任务 forkJoinPool.execute(ForkJoinTask<?> task)

3、定义一个ForkJoinTask

如何去定义一个ForkJoinTask,打开jdk文档,找到ForkJoinTask类,查看具体的子类。

其中递归事件没有返回值,而任务肯定要有结果,所以递归任务是有返回值的

点进任务,查看示例

代码示例:

package org.example.forkjoin;
/*
* 求和计算的任务
*
*
* 程序员的三六九等
* 三(普通求和)、六(ForkJoin)、九(Stream并行流)
*
*
* 使用ForkJoin:
* 1、ForkJoinPoll 通过他来执行
* 2、计算任务 forkJoinPool.execute(ForkJoinTask<?> task)
* 3、定义一个ForkJoinTask
*
*
* */
import java.util.concurrent.RecursiveTask;

public class ForkJoinDemo extends RecursiveTask<Long> {
    private Long start;
    private Long end;
    //临界值
    private Long temp = 10000L;

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


    //计算方法
    @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 = (end + start) / 2;//中间值
            ForkJoinDemo task1 = new ForkJoinDemo(start,middle);
            //拆分任务、把任务压入线程队列
            task1.fork();
            ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);
            task2.fork();

            return task1.join()+task2.join();
        }
    }
}

三六九等程序员的测试

package org.example.forkjoin;

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

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        test01();//11720
//        test02();//7369
        test03();//239
    }
    /*
    * 普通程序员
    * */
    public static void test01() {
        long startTime = System.currentTimeMillis();
        Long sum = 0L;
        for (Long i = 1L; i <= 10_0000_0000L; i++) {
            sum+=i;
        }
        long endTime = System.currentTimeMillis();
        System.out.println("结果:" + sum + "-->耗时:" + (endTime - startTime));
    }
/*
* 会使用ForkJoin
* */
    public static void test02() throws ExecutionException, InterruptedException {
        long startTime = System.currentTimeMillis();
        ForkJoinDemo forkJoinDemo = new ForkJoinDemo(0L,10_0000_0000L);
        ForkJoinPool forkJoinPool = new ForkJoinPool();
//        forkJoinPool.execute(forkJoinDemo);//执行
        ForkJoinTask<Long> submit = forkJoinPool.submit(forkJoinDemo);
        Long aLong = submit.get();
        long endTime = System.currentTimeMillis();

        System.out.println("结果:" + aLong + "-->耗时:" + (endTime - startTime));
    }
    /*
    * 九等程序员:Stream流并行运算
    * 效率高十几倍
    *
    * */
    public static void test03() {
        long start = System.currentTimeMillis();

        Long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);

        long end = System.currentTimeMillis();
        System.out.println("结果:" + sum + "-->耗时:" + (end - start));
    }
}

标签:JUC,编程,System,Long,ForkJoinTask,start,ForkJoin,public
From: https://www.cnblogs.com/nhgtx/p/17806024.html

相关文章

  • 面向结构编程
    面向结构的编程是一种基于任何协议都可以被结构替换这一事实的范例。这种方法的优点是性能。由于面向结构的方法基于使用静态调度的结构,因此面向协议的方法中的调度速度将与动态调度的协议显着不同。在面向结构的方法中,泛型和闭包有助于提供抽象。 ......
  • (七)C#编程基础复习——Switch语句
    switch语句有点类似ifelseif语句,都可以根据表达式执行某个语句块,使用之前要遵循以下几个条件:switch语句中表达式的值必须是一个整型或者枚举类型;在一个switch语句中可以有任意数量的case雨具,每个case关键字后面要跟一个表达式比较的值和一个冒号;case关键字后面的值必须与swi......
  • (六)C#编程基础复习——条件判断语句
    在C#中,if语句主要用于条件判断,C#中支持多种类型的if语句:if语句;ifelse语句;ifelseif语句;一、if语句if语句用于条件判断,其中包含一个布尔表达式,后面跟随着若干要执行的代码,当布尔表达式为真时,后面跟随的代码就会执行,如代码所示:intnum=12;if(num%2==0){C......
  • (五)C#编程基础复习——常量
    常量和我们前面介绍的变量相似,唯一不同的就是常量是值在程序的编译阶段就已经确定了,而且程序的运行期间不允许修改。常量可以是任何数据类型,例如整数常量、浮点常量、字符串常量等。一、定义常量常量用关键字——const定义,如代码所示:constdoublea=3.14;//声明常量double......
  • 如何学习编程语言?
    重复且高频、归纳与演绎、验证并预测怎么学?这也许是很多同学的心声,我与你一样,在初遇一个陌生技术栈时,会紧张不安。希望有人提供一个完美的学习路线,会在网络上不停的搜索同类型的技术,对比一下谁强谁弱。。事实上我们花了太多的时间去确认一个本就无法确认的东西,以至于别人都能够写......
  • python编程n阶乘
    在Python中,你可以使用递归或循环来计算n的阶乘。下面是两种不同的方法:使用递归计算n的阶乘:deffactorial_recursive(n):ifn==0orn==1:return1else:returnn*factorial_recursive(n-1)#示例用法n=5result=factorial_recursive......
  • 汇编程序语言设计的一些小点
    汇编学的时间好短,尽力速成一下程序设计,其他就靠背了DOS功能调用 1-键盘输入-2-屏幕输出 -3-辅助输入-4-辅助输出-5-打印器输出-6-直接控制台输入/输出-7-直接控制台输入,不回显-8-读取键盘不回显-9-显示字符串-0Ah-Buffered键盘输入-0Bh-检......
  • 实验3_C语言函数应用编程
    task1.c#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);//函数声明voidprint_spaces(intn);//函数声明voidprint_blank_lines(intn);//函数声......
  • 实验一 类和对象_基础编程1
    任务一task1.cpp#include<iostream>#include<string>#include<vector>#include<array>template<typenameT>voidoutput1(constT&obj){for(autoi:obj)std::cout<<i<<",";st......
  • JUC并发编程学习笔记(十二)Stream流式计算
    Stream流式计算什么是Stream流式计算大数据:存储+计算集合、MySql这些的本质都是存储东西的;计算都应该交给流来操作!一个案例说明:函数式接口、lambda表达式、链式编程、Stream流式计算packageorg.example.stream;importjava.util.Arrays;importjava.util.List;impo......