Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Fork和join概念_Java_Multithreading_Java 8_Operating System - Fatal编程技术网

Java Fork和join概念

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

这是一个示例代码,我写这只是为了让你理解我的问题,写在下面。 这是一个类,它有一个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 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声明为已同步。然后,您必须确定修改在语义上是否合适,因为您无法控制任务调用该方法的顺序。