2

我似乎在 Blackberry Java Reference 中找不到任何与 Semaphore 等效的东西。我错过了什么?java.util.concurrent 甚至不存在。

谢谢!肖恩

4

2 回答 2

1

因此,对于遇到此问题的任何人,coldice 的出色回答将我带到此页面,该页面解释了如何使用 J2ME http://tutorials.jenkov.com/java-concurrency/中提供的等待/通知原语来实现各种类型的信号量信号量.html。谢谢!

于 2009-10-30T14:03:38.333 回答
0

来自Eric Giguere 在 J2ME 应用程序中使用线程

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

因为每个 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() 之前锁定对象。这两种方法的行为相同,只是一种唤醒一个等待线程,而另一种唤醒所有等待线程。未指定唤醒线程的顺序。每个新唤醒的线程必须重新获得其对对象的锁定才能真正继续进行,因为它对对象的锁定在其挂起时已隐式释放。

于 2009-10-30T06:37:27.900 回答