黑莓信号量类

时间:2009-10-30 02:51:19

标签: blackberry concurrency semaphore

我似乎无法在Blackberry Java Reference中找到与Semaphore相同的内容。我错过了什么? java.util.concurrent甚至没有。

谢谢!肖恩

2 个答案:

答案 0 :(得分:1)

因此对于遇到此问题的人来说,coldice的优秀答案将我带到了这个页面,该页面解释了如何使用J2ME http://tutorials.jenkov.com/java-concurrency/semaphores.html中提供的wait / notify原语实现各种类型的信号量。谢谢!

答案 1 :(得分:0)

来自Using Threads in J2ME Applications by Eric Giguere

  

监视器维护一个等待线程的队列,一次只允许一个线程进入该块。

     

因为每个Java对象都可以充当监视器,java.lang.Object类定义了三个公开此基本功能的方法: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
}
...
  

同样,第二个线程必须在调用notify()或notifyAll()之前锁定对象。除了一个唤醒一个等待线程而另一个唤醒所有等待线程之外,这两个方法的行为相同。未指定线程被唤醒的顺序。每个新唤醒的线程必须在它实际进行之前重新获取对象的锁定,因为它在对象上的锁定在它自身暂停时被隐式释放。