USECASE:
1.有一个队列从另一个源异步填充。
2.需要一个接一个地使用该队列中的数据。有一个用例(播放声音),当队列中有多个元素时,队列中的数据提取应该每隔X秒发生一次。
以下是该示例代码段:
Queue<Wrapper> q = new ConcurrentLinkedQueue<>();
// filling up queue
void add(A obj) {
synchronized (q) {
q.add(obj);
q.notify();
}
}
以下是用于提取数据的消费者代码:
class Consumer extends Thread {
@Override
public void run() {
while ( true ) {
try {
synchronized ( q ) {
while ( q.isEmpty() )
q.wait();
// Get the item off of the queue
A w = q.remove();
// Process the work item
playSomeSoundForXsec(w);
Thread.sleep(3000);
}
}
catch ( InterruptedException ie ) {
break;
}
}
}
}
上述代码的问题:
静态代码分析错误:
在持有锁时,应使用wait(..)
代替“Thread.sleep(..)
”
当连续事件填满队列时,声音就会停止响起。
处理上述用例的更好方法。