2017-07-29 10 views
1

以下のコードを理解することができません。私の主な問題は、 "a"配列がスレッドの "table"配列に割り当てられた値で更新される理由です。より具体的には、 "a"配列が印刷されない理由を説明したいと思います最初の要素(0,1,2,3 ...)スレッドからの配列の更新

mainメソッドとスレッドのコード:

public class ThreadParSqrt 
{ 
    public static void main(String[] args) 
    { 
     double[] a = new double[1000]; 

     for (int i = 0; i < 1000; i++) 
      a[i] = i; 

     SqrtThread threads[] = new SqrtThread[1000]; 

     for (int i = 0; i < 1000; i++) 
     { 
      threads[i] = new SqrtThread(a,i); 
      threads[i].start(); 
     } 

     for (int i = 0; i < 1000; i++) 
     { 
      try { 
       threads[i].join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     for (int i = 0; i < 1000; i++) 
     { 
      System.out.println(a[i]); 
     } 
    } 
} 


public class SqrtThread extends Thread 
{ 
    private double [] table; 
    private int index; 

    public SqrtThread(double [] array, int ind) 
    { 
     table = array; 
     index = ind; 
    } 

    public void run() 
    { 
     table[index] = Math.sqrt(table[index]); 
    } 
} 

答えて

1

aが参照によりSqrtThreadのコンストラクタに渡されるため(参照によって検索パス/値渡し) 。このコンストラクタでは、現在arrayと呼ばれる参照がプライベートメンバーtableに格納されます。しかし、それは参照のため、tableの変更はaの変更になります(両方の参照が同じ配列をメモリ内に指しているため)。

スレッドセーフについても警告する必要がありますが、基本的なことはまだ学習しているようです。一度それらをつかむと、スレッドの同期、ロック、イベントなどを読みたいかもしれません。

関連する問題