2013-10-25 32 views
-1

我寫了一段代碼,其中我創建了一個類的多個實例,每個實例都有自己的線程。然而,當其中一個實例滿足一個條件(在這種情況下,當它的x座標是一個特定值)時,我希望該類的所有實例都改變方向。使用不同線程更改一個類的所有實例

任何人都有如何解決這個問題的一些想法? 謝謝。

編輯:這是代碼更改對象的方向。目前,每時的x座標達到750我希望所有的對象只要一個目標已經達到750

public void run() { 
    while(thread != null) { 
     while(x <= 750) { 
      if(x == 750) y+=100; 
      x+=1; 
      try { 
       thread.sleep(10); 
      } catch(Exception e) {} 
     } 
     while(x >= 10) { 
      if(x == 10) y+=100; 
      x-=1; 
      try { 
       thread.sleep(10); 
      } catch(Exception e) {} 
     } 
    } 

} 
+0

請添加您的代碼! – united

+1

每次更新所有對象一次。不要再使用比你需要的更多的線程。然後,您可以在更新或使用靜態字段時更改方向。 – Zong

回答

0

不知道爲什麼你需要一個以上的線程來改變方向的對象不僅改變這樣做是因爲使用多個線程更有可能使你模擬器a)更慢b)不可再生產,因爲不能保證線程何時運行或運行多久。

您可以通過更改確定方向的字段來更改方向。爲了能夠訪問它們,我建議你將它們放入可訪問的集合中。不用說,你必須這樣做是一個線程安全的方式,因爲你有多個線程。

如果您不確定如何做到這一點,我建議只使用一個線程開始,並在您知道如何並確定它會幫助時更改爲多個線程。

0

首先,Java中只有一個類的實例 - 類是靜態的。我認爲你正在創建那些類類型的對象的實例。這可能聽起來像爭論語義,但「類作用域」不同於「作用域範圍」,所以它是一個重要的信息。

您可能想從Java Concurrency lesson from oracle.開始您所描述的核心問題(線程通信)很常見。你應該能夠從Google獲得大量信息。但簡言之 - 您需要在所有主題上共享的常見信息。

+0

如果我記下對象之間的距離並使其保持不變,則這可以起作用。也感謝您的鏈接。 – Quanqai

0

不那麼難。
首先保存所有線程實例,然後只要線程滿足條件,然後更改其他線程實例。像這樣的東西。

class Foo implements Runnable{ 

    private final static List<Foo> instances=new ArrayList<Foo>(); 

     private volatile Direction d=Direction.U; 
     public changeDirection(Direction d){} 
      public void run(){ 
      // 
      if(<<GOT THE POINT>>){ 
       synchronized(instances){ 
       for(Foo fx:instances){fx.changeDirection(<<Desired direction>>);} 
       } 
      } 
      // 
      } 
     } 
     enum Direction{U,B,L,R} 
相關問題