次のコード フラグメントに問題があります。これは、イベント キュー (ConcurrentLinkedQueue) に追加されるイベント (processEvent メソッドの呼び出しによって提供される) を処理することを目的としています。イベントはイベント キューに追加され、run メソッドで定期的に処理されます。
ほとんどの場合、すべて問題ありません。しかし、processEvent メソッドの呼び出し後、イベントがキューに追加されたときに、実行部分が新しいイベントの存在を認識できないことがあります。
何が間違っているかについて何か考えはありますか?String 定数をロックとして使用する明らかな間違い以外に?
import java.util.concurrent.ConcurrentLinkedQueue;
public class MyCommunicator implements Runnable {
private ConcurrentLinkedQueue<MyEvent> eventQueue = null;
private boolean stopped = false;
private String lock = "";
private Thread thread = null;
public MyCommunicator() {
eventQueue = new ConcurrentLinkedQueue<MyEvent>();
}
public void start() {
thread = new Thread(this, "MyCommunicatorThread");
thread.start();
}
public void stop() {
stopped = true;
synchronized (lock) {
lock.notifyAll();
}
eventQueue.clear();
}
public void run() {
while (!stopped) {
try {
MyEvent event = null;
while (!stopped && ((event = eventQueue.peek()) != null)) {
sendEvent(event);
eventQueue.poll();
}
if (!stopped) {
synchronized (lock) {
lock.wait(10000L);
}
}
}
catch (Exception e) {
}
}
}
/**
* START EVENT JOB - ADD A NEW EVENT TO BE PROCESSED
*/
public void processEvent(MyEvent event) {
eventQueue.offer(event);
synchronized (lock) {
lock.notifyAll();
}
}
/**
* END EVENT JOB
*/
private void sendEvent(MyEvent event) {
// do send event job
}
}