2017-04-06 62 views
0

我有我試圖操縱一個變量兩個班,作爲一個例子影響在不同的類變量在Java中

public class A { 

    public static void main(String[] args) { 

     while(game_over[0] == false) { 
      System.out.println("in the while-loop"); 
     } 
     System.out.println("out of the while-loop"); 
    } 

    static boolean[] game_over = {false}; 
} 

public class B { 

    public boolean[] game_over; 

    public printBoard(boolean[] game_over) { 

     this.game_over = game_over; 
    } 

    public void run() { 

     for (int i = 0; i < 10; i++) { 
      // do something 
     } 
     game_over[0] = true; 
     System.out.println("GAME OVER"); 
    } 
} 

提供並不意味着該代碼段要成爲實際可行的代碼,我更關心這個概念。在我的程序中,類A創建了一個利用類B的線程,並且我希望類B影響變量'game_over',這樣A類中的while循環會受到變化的影響......任何想法我都能成功更新變量?謝謝。

+0

什麼是具有外部變量的意義呢?爲什麼不定義一個方法B.isGameOver()? –

+0

@MauricePerry我不知道laroy的原因,但通常情況下,可能有很多組件可以決定遊戲結束,並且爲了避免A必須檢查每個可以做出該決定的組件,它實際上是一個好主意提供一個間接的級別。 –

+0

@ErwinBolwidt好吧,在這種情況下,將它們傳遞給類GameStatus或GameMonitor的對象,而不是布爾值。 –

回答

1

不要爲此使用數組,因此難以確保數據競爭免費的應用程序。

由於您希望能夠將game_over標誌作爲獨立對象傳遞,因此實現正確的多線程應用程序的最簡單方法是使用AtomicBoolean類。

import java.util.concurrent.atomic.AtomicBoolean; 

class B { 
    private AtomicBoolean game_over; 

    public B(AtomicBoolean game_over) { 
     this.game_over = game_over; 
    } 

    public void run() { 
     // do stuff 
     game_over.set(true); 
    } 
} 

,並在A級:

public class A { 
    static AtomicBoolean game_over = new AtomicBoolean(); 

    public static void main(String[] args) { 
     B b = new B(); 
     Thread t = new Thread(b); 
     t.start(); 

     while (!game_over.get()) { 
      System.out.println("in the while-loop"); 
     } 
     System.out.println("out of the while-loop"); 
    } 
} 
+0

很好的答案。另一種選擇是聲明game_over是'volatile' – alfasin

+0

我可以看到這是如何工作的,但是在A類中創建AtomicBoolean時遇到問題 – laroy

+0

@alfasin這隻有在它不是數組時纔有效。因爲它是一個數組,volatile只會影響game_over數組引用的讀操作,但不會影響數組第一個元素的後續寫操作 - 所以仍然不能保證A類中的主循環將會看到更新。 –

相關問題