2017-07-29 62 views
1

我無法理解下面的代碼。我的主要問題是爲什麼使用在線程中分配給「表」數組的值來更新「a」數組。爲了更具體一點,我想解釋爲什麼「a」數組不能打印最初的元素(0,1,2,3 ...)。線程的陣列更新

的主要方法的代碼和線程:

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(因爲這兩個引用都指向內存中的相同數組)的更改。

我也許也應該提醒你關於線程安全等等,但是好像你還在學習基礎知識。一旦你抓住這些,你可能想要讀取線程同步,鎖定,事件等。