繁体   English   中英

分叉并加入Java

[英]Fork and Join Java

大家好,我需要一些作业帮助。 我了解Fork and Join Framework的工作方式,但是我的代码无法将结果结合在一起。 我们的工作是编写一个程序,该程序对数组中的真实值进行计数。 对这篇文章中的任何错误(语法错误或其他错误)表示抱歉,这是我的第一个错误。

编辑:感谢所有的请求,这是我对这个问题的解决方案:TrueFinder类:

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

class TrueFinder extends RecursiveTask<TrueResult>
{

    private static final int SEQUENTIAL_THRESHOLD = 5;

    private boolean[] trueData;

    private final int start;

    private final int end;

    public TrueFinder(boolean[] data, int start, int end)
    {
        this.trueData = data;
        this.start = start;
        this.end = end;
    }

    public TrueFinder(boolean[] data)
    {
        this(data, 0, data.length);
    }

    protected TrueResult compute()
    {
        final int length = end - start;
        int counter = 0;
        if (length < SEQUENTIAL_THRESHOLD)
        {
            for (int i = start; i < end; i++)
            {
                if (trueData[i])
                {
                    counter++;
                }
            }
            return new TrueResult(counter);
        }
        else
        {            
            final int split = length / 2;
            TrueFinder left = new TrueFinder(trueData, start, start + split);
            left.fork();
            TrueFinder right = new TrueFinder(trueData, start + split, end);

            TrueResult subResultRight = right.compute();
            TrueResult subResultLeft = left.join();
            return new TrueResult(subResultRight.getTrueCounter() +  
            subResultLeft.getTrueCounter());          
        }
   }


    public static void main(String[] args)
    {
        int trues = 0;
        boolean[] trueArray = new boolean[500];
        for (int i = 0; i < 500; i++)
        {
            if (Math.random() < 0.3)
            {
                trueArray[i] = true;
                trues++;
            }
            else
            {
                trueArray[i] = false;
            }
        }

        TrueFinder finder = new TrueFinder(trueArray);
        ForkJoinPool pool = new ForkJoinPool(4);

        long startTime = System.currentTimeMillis();
        TrueResult result = pool.invoke(finder);
        long endTime = System.currentTimeMillis();
        long actualTime = endTime - startTime;

        System.out.println("Array mit der Länge " + trueArray.length + " in"   
        actualTime + " msec dursucht und " + result.getTrueCounter() + 
        " von " + trues + " True Werten gefunden.");
    }
}

和结果类:

public class TrueResult
{
    private int trueCounter;

    public TrueResult(int counter)
    {
        this.trueCounter = counter;
    }

    public int getTrueCounter()
    {
        return trueCounter;
    }
}

您的源代码的拆分任务是错误的,因为:
(1)您的拆分不是从0开始的:
你的开始是1
(2)分割时忽略分数点;
(授予SEQUENTIAL_THRESHOLD = 5且trueArray.length = 13,您的拆分忽略了从11到12的数字)
(3)如果您对(1)和(2)进行了修改,则必须对子任务的长度进行分割,而不是SQCUQNTIALTHRESHOLD。

因此,修改后的源代码如下:

else
{
    int split = (length - 1 ) / SEQUENTIAL_THRESHOLD + 1;
    TrueFinder[] subtasks = new TrueFinder[split];
    int start = 0;
    for(int i = 0; i < split - 1; i++)
    {
        subtasks[i] = new TrueFinder(trueData, start, start + SEQUENTIAL_THRESHOLD);
        subtasks[i].fork();
        start += SEQUENTIAL_THRESHOLD;
    }
    subtasks[split - 1] = new TrueFinder(trueData, start, length);
    counter = subtasks[split - 1].compute();// better invoking compute than join
    for (int i = 0; i < SEQUENTIAL_THRESHOLD; i++)
    {
        counter += subtasks[i].join();
    }
    return new TrueResult(counter);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM