我似乎无法在Blackberry Java Reference中找到与Semaphore相同的内容。我错过了什么? java.util.concurrent甚至没有。
谢谢!肖恩
答案 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()之前锁定对象。除了一个唤醒一个等待线程而另一个唤醒所有等待线程之外,这两个方法的行为相同。未指定线程被唤醒的顺序。每个新唤醒的线程必须在它实际进行之前重新获取对象的锁定,因为它在对象上的锁定在它自身暂停时被隐式释放。