gpt4 book ai didi

java - Fork Join简单程序示例-需要有关错误的指导

转载 作者:行者123 更新时间:2023-12-03 13:11:42 24 4
gpt4 key购买 nike

基于对Java中ForkJoinPool执行程序服务的理解,我编写了一个小程序。程序的输出不符合要求。

我的理解:-我对ForkJoinPool的理解是,它是具有工作窃取功能的执行程序服务的另一种形式,它使线程在完成所有工作或变得空闲后从他人的队列中窃取工作。这会增加线程对cpu的使用。
fork 用于一个更大的任务拆分为较小的一个,直到时间的任务是很简单的顺序执行。
如果需要,联接将两个分开的任务联接起来以执行操作。

我的示例:-基于以上理解,我尝试创建一个程序。任务是调用Parson对象的run方法。数组中有四个人对象。我希望四个线程​​在所有这些Person对象上并行工作,这意味着在四个对象的数组中,我的基本条件是array,0,0。

预期输出:-不计算(不确定多少次)
你好(4次)
线程ID(4次)
实际输出的结果-在Compute中被打印了很多次,没有一次打招呼。输出不是固定的,它是变化的。

有人可以指导我解决我犯的错误吗?

package com.gc;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class FJMain {

public static void main(String[] args) {
// TODO Auto-generated method stub

Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
Person p4 = new Person();

Person[] array = new Person[4];
array[0] = p1;
array[1] = p2;
array[2] = p3;
array[3] = p4;

FJMain.MyRecursiveAction action = new FJMain().new MyRecursiveAction(array,0,3);

ForkJoinPool pool = new ForkJoinPool(4);
pool.invoke(action);

}

private class MyRecursiveAction extends RecursiveAction{

private Person[] array;
private int start;
private int end;


public MyRecursiveAction(Person[] array,int start,int end){
this.array = array;
this.start = start;
this.end = end;
}

@Override
protected void compute() {
// TODO Auto-generated method stub
System.out.println("In compute");
int mid = (this.start + this.end)/ 2;
if(mid < 1){
computeDirectly(array,mid);
}else{
MyRecursiveAction subTask1 = new MyRecursiveAction(array, start, mid);
subTask1.fork();
MyRecursiveAction subTask2 = new MyRecursiveAction(array, mid + 1, end);
subTask2.fork();
}
}

private void computeDirectly(Person [] array,int end){
for(Person p:array){
p.name();
}
}

}

}


package com.gc;

public class Person {

public void name(){
System.out.println("Hello");
System.out.println(Thread.currentThread().getId());
}

}

编辑
int beg = this.start;
int last = this.end;
int mid = (this.start + this.end)/ 2;
if((last - beg) < 1){
computeDirectly(array,beg);
}else{
MyRecursiveAction subTask1 = new MyRecursiveAction(array, start, mid);
subTask1.fork();
MyRecursiveAction subTask2 = new MyRecursiveAction(array, mid + 1, end);
subTask2.fork();
}

最佳答案

您的RecursiveAction创建不会终止的递归任务。

new MyRecursiveAction(array, 0, 3);

创造
mid = (0 + 3) / 2 = 1
new MyRecursiveAction(array, 0, 1);
new MyRecursiveAction(array, 2, 3);

哪个创造
mid = (0 + 1) / 2 = 0
completes

mid = (2 + 3) / 2 = 2
new MyRecursiveAction(array, 2, 2);
new MyRecursiveAction(array, 3, 3);

哪个创造
mid = (2 + 2) / 2 = 2
new MyRecursiveAction(array, 2, 2);
new MyRecursiveAction(array, 3, 2);

mid = (3 + 3) / 2 = 3
new MyRecursiveAction(array, 3, 3);
new MyRecursiveAction(array, 4, 3);

广告恶心。其中一些将使用 computeDirectly,但大多数将不会退化。

您必须修复基本情况和重复发生的方式。

关于java - Fork Join简单程序示例-需要有关错误的指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30380781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com