首页 > 其他分享 >fork-join 入门例子

fork-join 入门例子

时间:2023-04-26 10:33:21浏览次数:51  
标签:fork Fork join 入门 java Join File import final


一 介绍

Fork/Join 模式有自己的适用范围。如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用 Fork/Join 模式来解决。图 1 给出了一个 Fork/Join 模式的示意图,位于图上部的 Task 依赖于位于其下的 Task 的执行,只有当所有的子任务都完成之后,调用者才能获得 Task 0 的返回结果。

图 1. Fork/Join 模式示意图


可以说,Fork/Join 模式能够解决很多种类的并行问题。通过使用 Doug Lea 提供的 Fork/Join 框架,软件开发人员只需要关注任务的划分和中间结果的组合就能充分利用并行平台的优良性能。其他和并行相关的诸多难于处理的问题,例如负载平衡、同步等,都可以由框架采用统一的方式解决。这样,我们就能够轻松地获得并行的好处而避免了并行编程的困难且容易出错的缺点。


二 示例

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.List;
import java.util.ArrayList;
import java.io.File;

public class CalcFileSize
{
    private final static ForkJoinPool forkJoinPool = new ForkJoinPool();

    private static class CalcFileProcess extends RecursiveTask<Long>
    {
        /**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		final File file;

        public CalcFileProcess(final File theFile)
        {
            file = theFile;
        }

        @Override
        public Long compute()
        {
            long size = 0;
            if(file.isFile())
            {
                size = file.length();
            }
            else
            {
                final File[] children = file.listFiles();
                if(children != null)
                {
                    List<ForkJoinTask<Long>> tasks =
                        new ArrayList<ForkJoinTask<Long>>();
                    for(final File child : children)
                    {
                        if(child.isFile())
                        {
                            size += child.length();
                        }
                        else
                        {
                            tasks.add(new CalcFileProcess(child));
                        }
                    }

                    for(final ForkJoinTask<Long> task : invokeAll(tasks))
                    {
                        size += task.join();
                    }
                }
            }

            return size;
        }
    }
    
    public static void main(String[] args)
    {
        final long start = System.nanoTime();
        final long total = forkJoinPool.invoke(
            new CalcFileProcess(new File("D:/soft")));
        final long end = System.nanoTime();
        System.out.println("总大小: " + total);
        System.out.println("耗时: " + (end - start)/1.0e9);
    }
}




标签:fork,Fork,join,入门,java,Join,File,import,final
From: https://blog.51cto.com/u_16088628/6226507

相关文章

  • Java8 教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Java8是oracle公司于2014年3月发布,可以看成是自Java5以来最具革命性的版本。Java8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。Java8入门教程-从简单的步骤了解Java8,从基本到高级概......
  • 英语笔记:入门介绍
    短期快速掌握语法基础,不同时做几件事同时学语法和词汇,用造句的方法来学语法,再结合阅读巩固积累词汇,进而掌握造句和理解句子的能力,有了这个基础,再学发音,口语和听力,就容易多了。语法知识练习复习虽然能截取视频画面,但是最多一百张,字多了确实累,那还不如直接抄下来,在加上对自己......
  • 关于oracel 递归语法start with connect by 和 left join 一起使用的一个bug
    左表为树状结构机构表A,右表为人员表(有机构ID字段)BSELECTA.*,B.*FROMALEFTJOINBONA.ORG_ID=B.ORG_IDSTARTWITHA.ORG_ID='011000000004'CONNECTBYPRIORA.ORG_ID=A.P_ORG_ID查询结果出现,B表中的1条记录,最后重复出现。(最终的结果可能为:对A和B......
  • Go语言入门12(协程 goroutine)
    协程进程和线程进程​ 当运行一个应用程序的时候,操作系统会为这个应用程序启动一个进程。可以将这个进程看作一个包含了应用程序在运行中需要用到和维护的各种资源的容器。这些资源包括但不限于内存地址空间、文件和设备的句柄以及线程线程​ 一个线程是一个执行空间,这个空间......
  • C# Socket入门
    1.什么是Socketsocket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据;套接字就是四元组,即源ip+端口port目的ip+端口port,表示绝对唯一的连接;Socket是在应用层(Http、SSH......
  • kafka入门例子 for java
    1,生产者importjava.util.Properties;importkafka.javaapi.producer.Producer;importkafka.producer.KeyedMessage;importkafka.producer.ProducerConfig;publicclassTestProducer{publicstaticvoidmain(String[]args){Propertie......
  • Rust编程语言入门之最后的项目:多线程 Web 服务器
    最后的项目:多线程Web服务器构建多线程Web服务器在socket上监听TCP连接解析少量的HTTP请求创建一个合适的HTTP响应使用线程池改进服务器的吞吐量优雅的停机和清理注意:并不是最佳实践创建项目~/rust➜cargonewhelloCreatedbinary(application)`......
  • 大模型入门(五)—— 基于peft微调ChatGLM模型
    ChatGLM是基于 GeneralLanguageModel(GLM) 架构,针对中文问答和对话进行了优化。经过中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术,ChatGLM因为是中文大模型,在中文任务的表现要优于LLaMa,我在一些实体抽取的任务中微调ChatGLM-6B,都取得了很不错的效果。GL......
  • 《Python入门与核心语法》电子书
    《Python入门与核心语法》是由刘永富编写、中国水利水电出版社智博尚书分社编辑整理的电子书,共61页,内容包括Python的下载和安装,代码编写与执行等基础内容。PDF电子书下载: 链接:https://pan.baidu.com/s/1I9HhkKBWuujzk2jBgkR5-w提取码:2022配套视频合集: https://www.bilibili......
  • hello flume (Ubuntu 下 flume1.5单机版安装以及简单入门示例)
    1,下载最新的flume安装包:wgethttp://www.apache.org/dist/flume/stable/apache-flume-1.5.2-bin.tar.gz2,在安装目录解压:tar-zxvfapache-flume-1.5.2-bin.tar.gz3,设置环境变量exportJAVA_HOME=/usr;exportFLUME_HOME=/home/joeyon/apache-flume-1.5.2-bin;exportPATH=$PAT......