浅谈辄止_java forkjoinpool

浅谈辄止_java forkjoinpool文章目录一、ForkJoin是什么?它能用来实现什么功能?二、ForkJoin的实现原理三、ForkJoin的简单使用一、ForkJoin是什么?它能用来实现什么功能?二、ForkJoin的实现原理三、ForkJoin的简单使用在这里插入代码片…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


一、ForkJoin是什么?它能用来实现什么功能?

ForkJoin也是一种线程池,只不过ForkJoin是专为CPU密集型任务而建立的线程池,它能大大提高CPU密集型任务的执行效率。

二、ForkJoin的实现原理

ForkJoin是使用分治算法实现的,主要的原理就是将一个大的任务拆分为若干个小任务分发给若干个线程去处理,最后将若干的线程处理好后的结果进行汇总,从而达到提升计算效率的结果。
ForkJoin内部含有工作窃取逻辑:如果一个线程完成了本身所关联的工作队列中的人物,那么它会尝试从其它的工作队列中窃取任务来执行(窃取任务的位置是双端队列base端,工作线程一般都是从top端获取任务),从而提升了线程的使用率

三、ForkJoin的简单使用

package com.muyichen.demo.forkjoin;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

@Slf4j
public class ForkJoinExample extends RecursiveTask<Integer> { 
   

    public static final int threshold = 2;
    private int start;
    private int end;

    public ForkJoinExample(int start, int end) { 
   
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() { 
   
        int sum = 0;

        //如果任务足够小就计算任务
        boolean canCompute = (end - start) <= threshold;
        if (canCompute) { 
   
            for (int i = start; i <= end; i++) { 
   
                sum += i;
            }
        } else { 
   
            // 如果任务大于阈值,就分裂成两个子任务计算
            int middle = (start + end) / 2;
            ForkJoinExample leftTask = new ForkJoinExample(start, middle);
            ForkJoinExample rightTask = new ForkJoinExample(middle + 1, end);

            // 执行子任务
            leftTask.fork();
            rightTask.fork();

            // 等待任务执行结束合并其结果
            int leftResult = leftTask.join();
            int rightResult = rightTask.join();

            // 合并子任务
            sum = leftResult + rightResult;
        }
        return sum;
    }

    public static void main(String[] args) { 
   
        ForkJoinPool forkjoinPool = new ForkJoinPool();

        //生成一个计算任务,计算1加到100
        ForkJoinExample task = new ForkJoinExample(1, 100);

        //执行一个任务
        Future<Integer> result = forkjoinPool.submit(task);

        try { 
   
            log.info("result:{}", result.get());
        } catch (Exception e) { 
   
            log.error("exception", e);
        }
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191357.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • git clone 慢

    git clone 慢首先:查询最新的DNS网上很多设置的IP可能不一样http://github.global.ssl.fastly.net.ipaddress.com/ 2.修改host文件:host文件在Windows的路径为C:\Windows\System32\drivers\etc最好先备份一个原文件(备份是好习惯)有记事本打开即可151.101.185.194github.global….

  • mybatis 为什么要设置jdbcType

    mybatis 为什么要设置jdbcType以前没注意过这个问题,用ibatis的时候从来没有设置过jdbcType。ibatis也不会出现这个问题。学习了——————————————————————————————————————————————转载自:http://makemyownlife.iteye.com/blog/1610021前天遇到一个问题异常显示如下: 引用Exceptioninthr

    2022年10月20日
  • vscode插件大全_腾讯视频vip插件

    vscode插件大全_腾讯视频vip插件VSCode最全实用插件(VIP典藏版)

  • Android 的CompoundButton(抽象类按钮)、StringBuffer(字符串变量)「建议收藏」

    Android 的CompoundButton(抽象类按钮)、StringBuffer(字符串变量)「建议收藏」1、写在前面的话本人40岁纯小白一枚,最近对AndroidAPP有了兴趣,目前的任务:通过AndroidStudio利用Apchepoi、EasyExcel等第三方库,编写APP,实现移动端APP与后台Excel的数据交互。这次利用CSDN平台记录下自己的成长。纯属小白,有概念或者描述错误,希望大佬们不吝赐教,再此谢过。2、任务目标目前正在学习这本书,在做P110页的作业时,发现的问题:作业要求,点击“进入主页”的按钮,一次性获取已近选取的多选框的text属性,然后Toast出

  • java 反射getmethod_Java 反射机制中 getMethod()和getDeclaredField()区别

    java 反射getmethod_Java 反射机制中 getMethod()和getDeclaredField()区别今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类方法时,发生NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来找到getDeclaredField()能够访问本类中定义的所有方法。后来用这个方法解决了我遇到的问题。我查了javaapi文档,其中详细说明如下:…

  • windows,cmd中进行盘符的切换「建议收藏」

    windows,cmd中进行盘符的切换「建议收藏」需求描述:  在工作中,有的时候需要在cmd中进行盘符的切换,以前总有些时候 通过cd来切,就是切换不过去,每次都要进行百度查询,所以,这次就记录下,  留着以后再用。操作过程:1.通过win+r->cmd的方式进入到cmd命令行中2.通过盘符加冒号的方式,切换到不同的磁盘根目录下,举例:切换到d盘下,执行d:然后按回车备注:此时,就切换到了D盘的根…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号