2013-11-26 57 views
-1

我有一個Java程序創建線程,每個線程執行相同的代碼(相同的run())。將全局I/O參數傳遞給Java線程

我主要的樣子:

{ 
       // Create threads 
       GameOfLifeThread[][] threads = new GameOfLifeThread[vSplit][hSplit];   
       for(int i=0; i<vSplit; i++){ 
        for(int j=0; j<hSplit; j++){ 
         threads[i][j] = new GameOfLifeThread(initalField, ...); 
        } 
       }  
       // Run threads  
       for(int i=0; i<vSplit; i++){ 
        for(int j=0; j<hSplit; j++){ 

        // threads[i][j].run(); 
          (new Thread(threads[i][j])).start(); 
        } 
       } 

       return ...; 
    } 

initialField是一個全球性的二維數組。每個線程都應該對其進行一些更改。 問題是,在線程執行後,即使只有一個工作線程,該數組也保持不變。然而,當我運行

threads[i][j].run(); 

代替

(new Thread(threads[i][j])).start(); 

與單個工作線程(由主線程即純串行執行)的initalField變化,它應。

可能是什麼問題?它看起來像數組的元素是通過值傳遞的,但它不可能如此。

預先感謝您。

+2

顯示您的GameOfLifeThread代碼。 – wxyz

+0

可能您對initialField的訪問不同步。 – kofemann

+0

@tigran:這也是我的想法,這就是我答案中的不穩定因素。 – Burkhard

回答

0

藍色只是一個猜測:
你initalField必須是揮發性的,否則很可能由線程緩存,並不會得到改變(由其他線程觀看),因爲他們可以獲取緩存線程本地。

This and this答案可能會更好地解釋一下。