2014-06-21 103 views
0

我有這樣一個類:同步兩種方法在Java中

public class IClass{ 

    public void draw(){...}; //is called periodically by the rendering thread 
    public void foo(){...}; //is called asynchronously from another Thread(it could be an onTouchEvent() method for example) 
} 

我想,把foo()方法要等到抽籤方式完成,反之亦然。我怎樣才能在Java中做到這一點?

關於

+1

答案就在你的問題的稱號。讓它們同步:'public synchronized void draw(){...};'(和foo相同)。 http://docs.oracle.com/javase/tutorial/essential/concurrency/ –

+1

你在Java中使用匈牙利符號(很少見),並且使用它錯誤('I'意味着接口,而你有一個具體的類) 。 –

+0

同步方法並使對象線程在draw()中調用foo()。 – Alex

回答

4

使方法同步。

public synchronized void draw() { System.out.println("draw"); } 

public synchronized void foo() { System.out.println("foo"); } 

或同步在同一個對象上。

private static final Object syncObj = new Object(); 

public void draw() { 
    synchronized (syncObj) { 
     System.out.println("draw"); 
    } 
} 

public void foo() { 
    synchronized (syncObj) { 
     System.out.println("foo"); 
    } 
} 
+0

爲什麼你讓syncObj是靜態的?它應該同步所有實例的方法調用,對吧?但那樣會很糟糕。那麼可以簡單地刪除靜態修改器嗎? – user2224350

+0

如果你刪除了'static'modifier,那麼每個對象都有另一個syncObject,它取決於你想要的。 'static'取決於該類的所有實例,而不是該類的每個實例。 – Zarathustra

0

上的方法把​​意味着線程進入該方法之前收購的對象實例的鎖,所以如果你有兩種不同的方法,標誌着同步線程進入他們將爭奪同一個鎖,並且一旦一個線程獲得鎖定,則所有其他線程都將被關閉,從而在同一個鎖定上同步所有方法。因此,爲了使這兩種方法同時運行,他們將不得不使用不同的鎖,就像這樣:

public class IClass { 

     private final Object lockDraw = new Object(); 
     private final Object lockFoo = new Object(); 

     public void draw() { 
      synchronized(lockDraw) { 
      //method draw 
      } 
     } 

     public void foo() { 
      synchronized(lockFoo) { 
      //method foo 
      } 
     } 
} 

Both methods lock the same monitor. Therefore, you can't simultaneously execute them on the same object from different threads (one of the two methods will block until the other is finished).

+0

你的snyc對象不是'static',因此每個Object都有不同的監視器,注意 – Zarathustra