title: Java Thread execution on same data
body: <p>first of all here is the code, you can just copy an paste</p>
  
  <pre><code>import java.util.ArrayList;
  
  public class RepetionCounter implements Runnable{
  private int x;
  private int y;
  private int[][] matrix;
  private int xCounter;
  private int yCounter;
  private ArrayList&lt;Thread&gt; threadArray;
  private int rowIndex;
  private boolean[] countCompleted; 
  
  public RepetionCounter(int x, int y, int [][]matrix)
  {
      this.x = x;
      this.y = y;
      this.matrix = matrix;
      this.threadArray = new ArrayList&lt;Thread&gt;(matrix.length);
      this.rowIndex = 0;
      for(int i = 0; i &lt; matrix.length; i++){
          threadArray.add(new Thread(this));
      }
      countCompleted = new boolean[matrix.length];
  }
  
  public void start(){
      for (int i = 0; i &lt; threadArray.size(); i++){
          threadArray.get(i).start();
          this.rowIndex++;
      }
  }
  
  public void count(int rowIndex)
  {
      for(int i = 0; i &lt; matrix[rowIndex].length; i++){
          if (matrix[rowIndex][i] == x){
              this.xCounter++;
          } else if (matrix[rowIndex][i] == y){
              this.yCounter++;
          }
      }
  }
  
  @Override
  public void run() {
      count(this.rowIndex);
      countCompleted[this.rowIndex] = true;
  }
  
  public int getxCounter() {
      return xCounter;
  }
  
  public void setxCounter(int xCounter) {
      this.xCounter = xCounter;
  }
  
  public int getyCounter() {
      return yCounter;
  }
  
  public void setyCounter(int yCounter) {
      this.yCounter = yCounter;
  }
  
  public boolean[] getCountCompleted() {
      return countCompleted;
  }
  
  public void setCountCompleted(boolean[] countCompleted) {
      this.countCompleted = countCompleted;
  }
  
  public static void main(String args[]){
      int[][] matrix = {{0,2,1}, {2,3,4}, {3,2,0}};
      RepetionCounter rc = new RepetionCounter(0, 2, matrix);
      rc.start();
      boolean ready = false;
      while(!ready){
          for(int i = 0; i &lt; matrix.length; i++){
              if (rc.getCountCompleted()[i]){
                  ready = true;
              } else {
                  ready = false;
              }
          }
      }
      if (rc.getxCounter() &gt; rc.getyCounter()){
          System.out.println("Thre are more x than y");
      } else {System.out.println("There are:"+rc.getxCounter()+" x and:"+rc.getyCounter()+" y");
  
      }
  }
  
  }
  </code></pre>
  
  <p>What I want this code to do: I give to the object a matrix and tow numbers, and I want to know how much times these two numbers occurs in the matrix. I create as many thread as the number of rows of the matrix (that' why there is that ArrayList), so in this object I have k threads (supposing k is the number of rows), each of them count the occurrences of the two numbers.
  The problem is: if I run it for the first time everything work, but if I try to execute it another time I get and IndexOutOfBoundException, or a bad count of the occurrences, the odd thing is that if I get the error, and modify the code, after that it will works again just for once.
  Can you explain to me why is this happening?</p>