代码之家  ›  专栏  ›  技术社区  ›  Mukesh Gupta

Fork和join概念滞后

  •  -1
  • Mukesh Gupta  · 技术社区  · 9 年前

    这是一个类,它有一个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调度另一个线程,比如说使用a=5的fork 2,并为fork 1线程保存程序计数器,现在当使用a=5计算值时,它更改了examplemethod中的一些变量,之前由fork1更改,所以现在我的问题是,如果examplemethod是在该类的所有对象之间共享的资源,如果一个对象在函数中做了一些更改,而在中间(线程切换),另一个对象来了并更改了相同的变量,那么我的输出将受到影响,但问题是我得到了正确的答案,因此我的概念在并行线程中滞后,线程将共享一个公共资源,因此我的关键部分在代码中的什么位置。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Holger    9 年前

    方法中声明的变量为 ,具有特定方法调用的特定值。您应该首先独立于多线程方面理解这个概念。E、 g.以下程序将打印什么:

    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);
        }
    }
    

    当多个线程执行同一方法时,这些变量的局部性质不会改变。这些处决之间没有任何干涉。

    同样,实例变量,即在没有 static 修改器。保留特定于特定对象实例的值,因此,如果创建多个实例,它们可以为这些变量提供不同的值,而不会相互影响。

    你想要的东西 do,正在修改 静止的 变量或实例变量

        2
  •  1
  •   Vadim    9 年前

    代码中的线程之间共享了哪些资源?

    简而言之 class1

    虽然 class2 is not-当且仅当两个线程可以使用相同的 同时(也称为Singleton)和thread更改一些实例变量,而另一个实例变量使用它。

    中只有一个实例变量 int a .

    但是在代码中我没有看到任何类型的单例变量或实例变量 "a" 改变

    Class2 obj2=new Class2();

    (实际上,它一定有点 Class2 obj2=new Class2(aValue); )

    我错过什么了吗?