java thread

时间:2018-03-19 15:14:30

标签: java multithreading variables shared

我的程序没有返回预期的输出,我非常努力,但我不知道该怎么做这个代码。我该怎么办?

预期输出

1 2 3 4 5 6 7 8 ......2000

实际输出

1 2 3 4 5 6 1 2 3 4 5 6 ..1000

主要

public class Race_ConditonTest {

    public static void main(String[] args) {

        Race_Condition2 R1 = new Race_Condition2();
        Race_Condition2 R2 = new Race_Condition2();

        R1.start();
        R2.start();


   }
}

RaceCondition2(子类)

public class Race_Condition2 extends Thread{

    Race_Condition R= new Race_Condition();

    public void run() {
       R.sum();
    }   
}

RaceCondition类(超类)

public class Race_Condition  {
   int x=0;

   public int Load(int x){
       return x;
   }

    public void Store(int data) {
      int x= data;
      System.out.println(x);
    }

    public int Add(int i,int j) {
       return i+j ;
    }

    public void sum() {
       for (int i=0 ; i<1000 ; i++) { 
           this.x=Load(x);
           this.x=Add(x,1);
           Store(x);        
       }
    }
}

2 个答案:

答案 0 :(得分:0)

  

我该如何分享x?

简单方法&gt; make x static

...

static int x=0;

... 的修改

经过一些测试,如果你发现了一些奇怪的事情,那么让Store功能同步。

  public synchronized void Store(int data) {
      int x= data;
      System.out.println(x);
    }

查看同步工作synchronized

的工作原理

答案 1 :(得分:0)

如果您的目标是在R1和R2之间共享属性x,则可以在RaceCondition类中将其设置为静态。

static int x=0;

请注意,如果共享x,它们将同时访问它,因此可能产生一些奇怪的输出。创建访问x synchronized的函数(如here所述):

// static cause it only access a static field
// synchronized so the access the the shared resource is managed
public static synchronized void sum() {
   for (int i=0 ; i<1000 ; i++) { 
       this.x=Load(x);
       this.x=Add(x,1);
       Store(x);        
   }
}

您应该对其他功能进行相同的更改。