《Java并发编程实践》笔记8——Fork/Join框架

本文介绍了Fork/Join框架的基本概念及其实现原理。Fork/Join框架是JDK1.7提供的并行计算框架,它将大任务分解成多个小任务执行,最后汇总结果。文章对比了Fork/Join框架与Map-Reduce的区别,并提供了计算任务的示例代码。

《java并发编程实践》书中并没有介绍Fork/Join框架,该框架和并发编程关系密切,也是由本书作者之一Doug Lea在JDK1.7引入,因此作为最后一篇笔记简单介绍。
Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,它把一个大任务分割为若干个小任务执行,最后将小任务的执行结果汇总得到大任务的结果。当看到这个定义时,我想很多人会和我一样立刻想到现在非常热门的Map-Reduce思想。二者的对比如下:
共同点:
都是用于执行并行任务的。基本思想都是把复杂问题分解为一个个简单的子问题分别计算,再合并结果。应该说并行计算都是这种思想,彼此独立的或可分解的。从名字上看Fork和Map都有切分的意思,Join和Reduce都有合并的意思,比较类似。
区别:
(1).环境差异:
分布式 vs 单机多核:Fork/Join设计初衷针对单机多核(处理器数量很多的情况)。Map-Reduce一开始就明确是针对很多机器组成的集群环境的。也就是说一个是想充分利用多处理器,而另一个是想充分利用很多机器做分布式计算。这是两种不同的的应用场景,有很多差异,因此在细的编程模式方面有很多不同。
(2).编程差异:
Map-Reduce一般是:做较大粒度的切分,一开始就先切分好任务然后再执行,并且彼此间在最后合并之前不需要通信。这样可伸缩性更好,适合解决巨大的问题,但限制也更多。Fork/Join可以是较小粒度的切分,任务自己知道该如何切分自己,递归地切分到一组合适大小的子任务来执行,因为是同一个JVM内,所以彼此间通信是很容易的,更像是传统编程方式。
综上所述,我们可以认为Fork/Join是同一个JVM内的Map-Reduce的一种实现方式。
Fork/Join的基本工作流程如下图:
这里写图片描述
Fork-Join框架的实现原理为:
首先,分割任务,只要任务的粒度超过阀值,就不停地将任务分拆为小任务;
然后,将分割的任务任务添加到双端队列中,启动线程从双端队列获取任务执行,将执行结果统一放到一个队列中;
最后,再启动一个线程合并结果队列的值。
Fork-Join框架涉及的主要类如下:
这里写图片描述
RecursiveAction:用于没有返回值的任务。
RecursiveTask:用于需要返回值的任务,通过泛型参数设置计算的返回值类型。
ForkJoinPool:提供了一系列的submit方法,计算ForkJoinTask(需要实现computer方法)。
我们以计算1+2+3+4结果为例,来演示Fork/Join的使用,我们设置阀值为2,则由于是4个数字相加,因此Fork/Join框架会分拆为两个子任务,一个计算1+2,另一个计算3+4,最后在把两个子任务的结果合并,例子代码如下:

public class CounterTask extends RecursiveTask<Integer>{
    private static final int THRESHOLD = 2;
    private int start;
    private int end;

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

    protected Integer computer(){
        int sum = 0;
        boolean canComputer = (end - start) <= THRESHOLD;
        if(canComputer){
            for(int i = start; i <= end; i++){
                sum += i;
            }
        }else{
            int middle = (start + end) / 2;
            CounterTask leftTask = new CounterTask(start, middle);
            CounterTask rightTask = new CounterTask(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 pool = new ForkJoinPool();
        CounterTask task = new CounterTask(1, 4);
        Future<Integer> result = pool.submit(task);
        try{
            System.out.println("result is:" + result.get());
        }catch(InterruptedException e){
        }catch(ExecutionException e){
        }finally{
            pool.shutdown();
        }
    }
}
内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。
内容概要:本文围绕“考虑电动汽车灵活性的微网多时间尺度协调调度”展开研究,提出了一种基于Matlab代码实现的优化调度模型。该模型深入挖掘电动汽车作为灵活可控负荷与分布式储能单元的双重潜力,通过构建日前、日内及实时等多时间尺度的协调调度机制,有效应对光伏发电的间歇性与波动性,实现微电网内部功率的动态平衡。研究综合集成了电动汽车集群的有序充放电管理、储能系统协同优化与多种需求响应策略,建立了以系统运行成本最小化、可再生能源消纳最大化及供电可靠性最优化为目标的综合数学模型,并采用Matlab进行仿真求解。结果表明,所提方法能显著平抑功率波动,优化源-荷-储资源的时空配置,提升微电网运行的经济性与稳定性。; 适合人群:电气工程、能源与动力工程、控制科学与工程、电力系统及其自动化等专业的研究生、高校科研人员,以及从事智能电网、微电网规划、电动汽车与电网互动(V2G)技术研发的工程技术人员。; 使用场景及目标:①研究高比例可再生能源接入背景下,含大规模电动汽车的微电网协同优化运行策略;②掌握多时间尺度滚动优化的建模思想与Matlab/Simulink仿真技术;③探索电动汽车聚合商参与电力市场辅助服务的可行路径与效益评估方法; 阅读建议:建议读者结合提供的Matlab代码进行复现与调试,深入理解目标函数构建、约束条件处理及求解器调用等关键技术环节,可尝试引入电池老化模型、用户出行行为不确定性等更贴近实际的因素,以深化研究的实用性与前瞻性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值