【发布时间】:2017-12-14 14:28:26
【问题描述】:
这是一个示例代码,我写这个只是为了让你理解我写在下面的问题。 这是一个类,它有一个示例方法,可以为不同的 a 计算一些值;
public class Class1{
public int examplemethod(int a){
int k = a*2;
int b=k+1;
......some more manipulation
return k;
}
}
下面的类会并行调用上面的方法
public class Class2 extends RecursiveTask<Integer>{
int a=0;
Class1 obj;
public Class2(int a, Class1 obj){
this.a = a;
this.obj=obj;
}
@Override
protected Integer compute () {
return obj.examplemethod(a);
}
public static void main(Strings[] args){
List<Class2> list =new ArrayList<Class2>();
Class1 obj = new Class1();
for(int i=4;i<7;i++){
Class2 obj2=new Class2(obj);
obj2.fork();
list.add(obj2);
}
int arr[]=new int[4];
int i=0;
if(list.size>0){
for(Class2 ob:list){
arr[i++]= ob.join();
}
}
}
}
我在 for 循环中创建了 class2 的三个对象,因此假设第一个 fork 将使用 a=4 计算值,但是当它在 examplemethod 中计算时,cpu 调度另一个线程让我们说 fork 2 使用 a=5 并保存程序fork 1 线程的计数器,现在在使用 a=5 计算值时,它会更改 examplemethod 中的一些变量,而这些变量之前是由 fork1 更改的,所以现在我的问题是,如果 examplemethod 是在该类的所有对象之间共享的资源,并且如果一个对象在函数中做了一些更改,在中间(线程切换)一些其他对象出现并更改了相同的变量,然后我的输出会受到影响,但问题是我得到了正确的答案,所以我的概念在并行线程中滞后,线程将共享一个公共资源,所以我的代码中的关键部分在哪里。
【问题讨论】:
-
(1) 请遵守名称约定,让每个人都更容易使用——特别是,类名应该是驼峰式,首字母大写。 (2) 您的代码无效。它的问题之一是它为类
class2调用了一个无参数构造函数,但该类没有这样的构造函数,并且它试图使用原始类型int作为类型参数。这不是一份详尽的清单。 -
b=x;-- 什么是b?如果该陈述是相关的,那么您已经省略了重要的细节;如果没有,请不要包含它。此外,一个非常长的连续句子非常难以破译。如果您需要帮助,请让其他人更容易理解您的问题。此外,RecursiveTask<int>不是有效的 Java。请包含可编译的代码。 -
我做了一些更改,请删除标记它的 -1,如果您仍然想要一些更改,我可以这样做,我没有提供我的实际代码我只是正确的示例 pseduo,以便我的问题可以是可以理解。
-
在文档中有一个关于如何使用RecursiveTask的最小示例。
-
一个类构造函数没有
void返回类型,进一步它必须区分大小写匹配类名,即public Class2(int a) { this.a = a; }此外,你必须在构造对象时指定适当的参数,new Class2(i).
标签: java multithreading java-8 operating-system