美文网首页
2019-07-10_ForkJoinpPool大任务拆解操作记

2019-07-10_ForkJoinpPool大任务拆解操作记

作者: kikop | 来源:发表于2019-07-14 09:00 被阅读0次

ForkJoinpPool大任务拆解操作记录
1概述
forkjoin执行任务的核心在于compute()方法,先判断任务是否足够小,如果足够小就直接计算。否则,把自身的任务一拆位二,分别计算。
1.1编写任务处理逻辑
package com.tech.ability.myjacob;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.RecursiveTask;

/**

  • @author kikop

  • @version 1.0

  • @project Name: TechnicalAbilityToolBox

  • @file Name: MySumTask

  • @desc 功能描述

  • @date 2019/7/8

  • @time 22:39

  • @by IDE: IntelliJ IDEA
    */
    public class MySumTaskLong extends RecursiveTask<Long> {

    static final int THRESHOLD = 100;
    long[] array;
    int start;
    int end;
    String strFileNamePrefix = "D:/myjacobtest/mysumtask_";

    MySumTaskLong(long[] array, int start, int end) {
    this.array = array;
    this.start = start;
    this.end = end;
    }

    @Override
    protected Long compute() {
    if (end - start <= THRESHOLD) {
    // 如果任务足够小,直接计算:
    long sum = 0;
    File file = new File(String.format("%s%03d.doc", strFileNamePrefix, start));
    if (!file.exists()) {
    try {
    file.createNewFile();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    try {
    FileWriter fileWriter = new FileWriter(file);
    for (int i = start; i < end; i++) {
    fileWriter.write(i + " ");
    sum += array[i];
    }
    fileWriter.write("\r\n任务执行结果:"+sum + "!");
    fileWriter.flush();

// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// }
System.out.println(String.format("compute %d~%d = %d", start, end, sum));
} catch (IOException e) {
e.printStackTrace();
}

        return sum;
    }
    // 任务太大,一分为二:
    int middle = (end + start) / 2;
    System.out.println(String.format("split %d~%d ==> %d~%d, %d~%d", start, end, start, middle, middle, end));
    MySumTaskLong subtask1 = new MySumTaskLong(this.array, start, middle);
    MySumTaskLong subtask2 = new MySumTaskLong(this.array, middle, end);
    invokeAll(subtask1, subtask2);
    Long subresult1 = subtask1.join();
    Long subresult2 = subtask2.join();
    Long result = subresult1 + subresult2;
    System.out.println("result = " + subresult1 + " + " + subresult2 + " ==> " + result);
    return result;
}

}

1.2测试
package com.tech.ability.myjacob;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;

/**

  • @author kikop

  • @version 1.0

  • @project Name: TechnicalAbilityToolBox

  • @file Name: MySumTaskTest

  • @desc 功能描述

  • @date 2019/7/8

  • @time 22:39

  • @by IDE: IntelliJ IDEA

  • 参考:https://www.liaoxuefeng.com/article/1146802219354112
    */
    public class MySumTaskLongTest {

    private static void fillRandom(long[] array) {
    for (int i = 0; i < array.length; i++) {
    array[i] = i;
    }
    }

    public static void main(String[] args) {

     // 创建随机数组成的数组:
     long[] array = new long[400];
     fillRandom(array);
     // fork/join task:
     ForkJoinPool fjp = new ForkJoinPool(4); // 最大并发数4
     ForkJoinTask<Long> task = new MySumTaskLong(array, 0, array.length);
     long startTime = System.currentTimeMillis();
     Long result = fjp.invoke(task);
     long endTime = System.currentTimeMillis();
     System.out.println("Fork/join sum: " + result + " in " + (endTime - startTime) + " ms.");
    

    }
    }
    1.3 结果
    split 0~400 ==> 0~200, 200~400
    split 0~200 ==> 0~100, 100~200
    split 200~400 ==> 200~300, 300~400
    compute 0~100 = 4950
    compute 200~300 = 24950
    compute 100~200 = 14950
    result = 4950 + 14950 ==> 19900
    compute 300~400 = 34950
    result = 24950 + 34950 ==> 59900
    result = 19900 + 59900 ==> 79800
    Fork/join sum: 79800 in 268 ms.
    2 使用注意点
    New Task1
    New Task2
    InvokeAll(task1,task2)
    Task1.join()
    Task2.join()

相关文章

  • 2019-07-10_ForkJoinpPool大任务拆解操作记

    ForkJoinpPool大任务拆解操作记录1概述forkjoin执行任务的核心在于compute()方法,先判断...

  • 提升执行力的小技巧

    今天得到一个提高执行力的小技巧。任务拆解+小目标。 任务拆解就是把大项任务拆解为可达成的小项,一点...

  • 拆解任务

    生活中有许多我们能做却不愿意做的事情,难度也不是多高,但就是很麻烦,通过自己的努力也能完成。这样的事情其实是自...

  • 第三周 专注力第一课 创造心流

    上一周我们学习了“拆解力”,运用“下一步行动”把“项目”拆解成“任务”,再把“任务”拆解成“行动”。当按着步骤一步...

  • 拆解任务执行任务

    从37-100想过来,可以改变的地方很多,首先是接受现状,不要逃避、也不要做摩尔运动。有些问题不解决就会一直伴随你...

  • 【0414】主题:任务拆解

    一个特别靠谱的运营,在着手解决问题开展工作的时候,会尽力让70%的事情办得对自己可知可控,只留下30%的不确定性。...

  • Day 750:任务拆解

    任务分解,我觉得应该是四大原则(其余三个是以终为始、沟通反馈、自动化)里最关键一环。怎么分解,分解到什么程度,怎么...

  • 学习笔记—任务拆解

    【优胜行动派️❤学习日记】 [打卡宝宝]:张雪 [打卡日期]:2019/2/18 [累计坚持]:这是我坚持学习的第...

  • 专注力---创造心流

    (以下内容来源于Hubert) 我们已经学习了“拆解力”,运用“下一步行动”把“项目”拆解成“任务”,再把“任务”...

  • 拆解任务的套路

    在项目管理的时候,面对一个大的任务,为了更有效地使用资源(时间、金钱、人力等),多数情况需要拆解任务,项目管理老师...

网友评论

      本文标题:2019-07-10_ForkJoinpPool大任务拆解操作记

      本文链接:https://www.haomeiwen.com/subject/tqlckctx.html