4

私は問題を解決しようとしています.これが実現可能かどうかにかかわらず、このフォーラムの専門家と理解しようとしていません.問題は、Javaを使用したスレッド間通信にあります.

私はクラスを持っています:

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

たとえば、4 つ以上のスレッドがあります。

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

スレッドが 1 つのメソッドを設定している場合、他のすべてのスレッドが他のメソッドで動作するように同期を設計する必要があります。

例えば:

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()
4

2 に答える 2

9

これを外部で行う必要があります。

ReentrantLockインスタンス間でa を共有しRunnableます。

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それに応じて s を処理します。実行するtryLock()と返されます

ロックが解放され、現在のスレッドによって取得された場合、またはロックが現在のスレッドによって既に保持されている場合は true 。それ以外の場合は false

ブロッキングは関係なく、すぐに戻ります。が返された場合はfalse、別の方法を使用できます。操作が終わったら、ロックを解除することを忘れないでくださいsetX()

于 2013-10-11T18:33:55.000 に答える
3

良い質問です。tryLockを使用できます。

次のようにする必要があります。

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

   }
   public void setY() {
        // Your stuff here
   }
}
于 2013-10-11T18:36:08.667 に答える