2013-10-11 118 views
4

我試圖解決一個問題,這是否可行或不是試圖瞭解與在這個論壇的專家,問題是與使用java的線程間通信。N線程多線程

我有一個類:

class A { 
    public void setX() {} 
    public void setY() {} 
} 

我有4個或更多個線程,例如:

T1,T2,T3,T4 are the threads that operates on this Class 

我要設計以這樣的方式同步如果在任何時間,如果一個線程是設置一個方法,其他所有線程將在另一種方法操作

如:

if thread T1 is operating on setX() methods then T2,T3,T4 can work on setY() 
if thread T2 is operating on setX() methods then T1,T3,T4 can work on setY() 
if thread T3 is operating on setX() methods then T1,T2,T4 can work on setY() 
if thread T4 is operating on setX() methods then T1,T2,T3 can work on setY() 
+0

你做了什麼樣的研究?你有什麼嘗試? – Gray

+0

我建議策略模式 – 2013-10-11 19:43:13

回答

9

您將不得不在外部執行此操作。

Runnable實例之間共享ReentrantLock

A a = new A(); 
ReentrantLock lock = new ReentrantLock(); 
... 
// in each run() 
if (lock.tryLock()) { 
    try { 
     a.setX(); // might require further synchronization 
    } finally { 
     lock.unlock(); 
    } 
} else { 
    a.setY(); // might require further synchronization 
} 

相應地處理Exception。當tryLock()運行它返回

真如果鎖是免費的,是由當前線程獲取,或者 鎖已經被當前線程持有;否則爲假

它立即返回,不涉及阻塞。如果它返回false,則可以使用其他方法。在setX()上完成操作後,您不能忘記釋放鎖。

3

不錯的問題。 您可以使用tryLock

你應該這樣做:

class A 
{ 
    public void setX() { 
     if (tryLock(m_lock)) 
     { 
      // Your stuff here 
     } else { 
      setY(); 
     } 

    } 
    public void setY() { 
     // Your stuff here 
    } 
}