浅谈辄止_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);
        }
    }

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 罗技k375s键盘怎么连接_罗技k380键盘怎么连接手机

    罗技k375s键盘怎么连接_罗技k380键盘怎么连接手机罗技K375s无线蓝牙键盘使用总结(连接|手感)首先我们先来试试优联连接。优联只支持PC(废话)。如果之前没有配对过,需要再下个优联的软件来进行配对。不得不说,罗技的网站打开真慢,服务器估计在国外。而且中文主页,K375S竟然还没上架,列表里没有,也搜索不到。我用的是旧的优联,已经配对了M570。配对新设备之后,其实就连上了。要你输入一些字符确认。不过这里的K370S是怎么回事,这命名……既然…

    2022年10月15日
    0
  • 解决mysql java.sql.SQLException: The server time zone value‘XXXXXX’ is unrecognized or represents…

    解决mysql java.sql.SQLException: The server time zone value‘XXXXXX’ is unrecognized or represents…个人错误总结解决java.sql.SQLException:Theservertimezonevalue‘XXXXXX’isunrecognizedorrepresentsmorethanonetimezone.1.报错截图使用的数据库是MySQL,驱动是6.0.3,这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT

    2022年10月21日
    0
  • 使用Python暴力激活成功教程密码

    使用Python暴力激活成功教程密码由于业务需求,今天项目对接了百度云智能的风控系统,注册和登陆保护,想来测试一下性能,用python写了一个脚本,暴力激活成功教程密码,看看会不会触发风控一、首先在本地新建了一个数据库,保存已经试错过的密码CREATETABLE`test`.`pwd`(`id`int(10)NOTNULLAUTO_INCREMENT,`passwod`varchar(20)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULLDEFAULT’…

    2022年8月22日
    6
  • Python3 实例–Python 计算圆的面积

    Python3 实例–Python 计算圆的面积#代码如下:#Python3实例–Python计算圆的面积print(“Python3实例–Python计算圆的面积”)#公式中r为圆的半径。r=float(input())PI=3.14s=PI*(r**2)print(“圆的面积为:{}”.format(s))#运行结果如下:Python3实例–Python计算圆的面积3圆的面积为:…

    2025年6月5日
    0
  • 一个人决定离职的征兆有哪些?「建议收藏」

    一个人决定离职的征兆有哪些?

    2022年2月18日
    116
  • O2O网站

    O2O网站

    2021年10月14日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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