Java Fork和join概念
这是一个示例代码,我写这只是为了让你理解我的问题,写在下面。 这是一个类,它有一个examplemethod,可以为不同的a计算一些值Java Fork和join概念,java,multithreading,java-8,operating-system,Java,Multithreading,Java 8,Operating System,这是一个示例代码,我写这只是为了让你理解我的问题,写在下面。 这是一个类,它有一个examplemethod,可以为不同的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 exte
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循环中创建了类2的三个对象,因此假设第一个fork将使用a=4计算值,但在examplemethod中计算时,cpu调度另一个线程,比如说fork 2使用a=5,并为fork 1线程保存程序计数器,现在,当使用a=5计算值时,它改变了examplemethod中的一些变量,这是fork1之前改变的,所以现在我的问题是,如果examplemethod是在该类的所有对象之间共享的资源,并且如果一个对象在函数中做了一些更改,并且在中间线程中切换了其他对象并更改了相同的变量,那么我的输出将受到影响,但问题是我得到了正确的答案,所以,当我的概念落后于并行线程时,线程将共享一个公共资源,那么我的代码中的关键部分在哪里呢 代码中的线程之间共享哪些资源 简而言之,class1是线程安全的,因为在方法中定义的变量不能被其他线程更改 而class2不是-当且仅当两个线程可以同时使用class2的同一个实例(也称为Singleton)并且线程更改了某个实例变量,而另一个线程使用它 在class2中只有一个实例变量-int a 但是在代码中我没有看到任何类型的单例变量或实例变量achange 每个线程都有一个新的class2实例:class2 obj2=newclass2 实际上,它必须是类2 obj2=新的类2avalue
我遗漏了什么吗?方法中声明的变量是局部变量,具有特定方法调用的特定值。您应该首先独立于多线程方面理解这个概念。例如,以下程序将打印什么:
public class Test {
public static void main(String[] args) {
test(5);
}
private static void test(int i) {
System.out.println("enter test with "+i);
if(i>0) test(i-1);
System.out.println("leave test with "+i);
}
}
当多个线程执行同一方法时,这些变量的局部性质不会改变。这些处决之间没有任何干涉
同样,实例变量,即在没有静态修饰符的类中声明的成员变量。保留特定于特定对象实例的值,因此,如果创建多个实例,它们可以具有这些变量的不同值,而不会相互影响
这些是构建块,用于构建多线程程序,而无需始终执行线程同步。如果创建表示要执行的不同任务的不同对象,并且这些任务仅执行使用这些对象和/或其方法参数的方法,方法参数是计算结果的局部变量,则这些任务已被隔离
您不能做的事情是修改共享对象的静态变量或实例变量。在您的代码中,没有共享对象。1请遵守名称的约定,使每个人都更容易使用,具体来说,类名应为CAMELLCASE,首字母大写。2您的代码无效。它的问题之一是,它为类2调用了一个无参数构造函数,但该类没有这样的构造函数,并且它试图使用基元类型int作为类型参数。这不是一个详尽的列表。b=x;-什么是b?如果这句话是相关的,那么你忽略了重要的细节;如果没有,就不要包括在内。而且,一个很长的句子很难破译。如果您需要帮助,请让他人容易理解您的问题。此外,RecursiveTask不是有效的Java。请包括可编译的代码。我做了一些更改,请删除-1标记,如果您仍然需要一些更改,我可以这样做,我没有提供我的实际代码,我只是正确的示例psedoo,这样我的问题就可以理解。文档中有一个关于如何使用的最小示例。类构造函数没有void返回类型,而且它必须敏感地匹配类名大小写,即public Class2int a{this.a=a;}进一步,在构造对象new Class2i时,必须指定适当的参数。因此,如果我共享一个对象b/w threads并计算该值,那么我需要使用synchronize?我已经为此更新了代码,关键是修改了共享状态。在代码中,Class1没有实例变量,因此examplemethod无法修改它们。如果Class1有实例变量,而examplemethod正在修改它们,则必须使用线程安全结构,例如,将examplemethod声明为已同步。然后,您必须确定修改在语义上是否合适,因为您无法控制任务调用该方法的顺序。