2

Blackberry Java Reference でセマフォに相当するものを見つけることができないようです。私は何が欠けていますか?java.util.concurrent さえありません。

ありがとう!ショーン

4

2 に答える 2

1

したがって、これに出くわした人にとっては、coldice の優れた回答により、J2ME http://tutorials.jenkov.com/java-concurrency/で利用可能な待機/通知プリミティブを使用してさまざまなタイプのセマフォを実装する方法を説明するこのページに導かれます。 semaphores.html。ありがとう!

于 2009-10-30T14:03:38.333 に答える
0

Eric Giguere の Using Threads in J2ME Applicationsから:

モニターは待機中のスレッドのキューを維持し、一度に 1 つのスレッドのみがブロックに入ることができるようにします。

すべての Java オブジェクトはモニターとして機能できるため、java.lang.Object クラスでは、この基本機能を公開する 3 つのメソッド (wait()、notify()、および notifyAll()) が定義されています。任意のスレッドは、オブジェクトの wait() メソッドを呼び出すことで、それ自体を一時停止できます。

...
Object obj = .... // some object to use as a lock

synchronized( obj ){
    // here is where you'd check obj's state

    try {
    obj.wait();
    }
    catch( InterruptedException e ){
    }
}
...

スレッドは、wait() メソッドを呼び出す前にオブジェクトをロックする必要があります。また、java.lang.InterruptedException をキャッチし、スレッドの中断を適切に処理する必要があります。スレッドは、それ自体を中断した後、オブジェクトのロックを暗黙的に解放します。

wait() メソッドはオーバーロードされています。無期限に待機したくない場合、スレッドはオプションのタイムアウトをミリ秒単位で指定できます。

スレッドが一時停止すると、別のスレッドが同じオブジェクトの notify() または notifyAll() メソッドを呼び出してスレッドを解放します。

...
Object obj = .... // same object used as lock!

synchronized( obj ){
    obj.notify();  // or notifyAll
}
...

この場合も、2 番目のスレッドは、notify() または notifyAll() を呼び出す前にオブジェクトをロックする必要があります。これら 2 つのメソッドは、一方が 1 つの待機中のスレッドをウェイクアップし、もう一方がすべての待機中のスレッドをウェイクアップすることを除いて、同じように動作します。スレッドが起動される順序は指定されていません。新しく起動された各スレッドは、実際に続行する前に、オブジェクトのロックを再取得する必要があります。これは、オブジェクトのロックが中断されたときに暗黙的に解放されたためです。

于 2009-10-30T06:37:27.900 に答える