У меня сценарий: Несколько событий происходят из источника, с разными типами. Мне нужно что-то делать с каждым событием того же типа в последовательности и параллельно, если это другой тип. Значение:Темы не просыпались с уведомлением
События от источника: A1, A2, B1, A3, B2, C1
- слушателю, должны стоять в очереди A1, A2 и A3, и работать с ними в этом порядке, в один поток
- Слушатель B так же, как а, параллельно, в другом потоке
- Слушатель C такой же, как B, параллельно, в другом потоке
Что я делаю, чтобы достичь т его? в общих чертах, у меня есть монитор для каждого типа событий, который я инициализирую с помощью нового потока, а затем вызываю wait(). Каждый монитор имеет очередь.
Monitor.java (реализует Runnable)
public void run(){
while(!killed){
synchronize(this){
while(this.stopped){
wait(); //it waits here when initialized, waiting for the first event
}
while(eventQueue.size() > 0){
//do something with the event
}
//i set the flag stopped = true again to wait for the next event
this.stopped = true;
}
}
}
Когда приходит событие, я добавить его в очередь, уведомив() монитор так, чтобы он ломает время
public void awake(Event event){
synchronize(this){
eventQueue.add(event);
this.stopped = false;
notify();
}
}
Флаг «убитый» используется для поддержания потока в живых до тех пор, пока не будут выполнены определенные критерии. Затем я устанавливаю убитый флаг в true и уведомляю монитор о завершении потока.
Моя проблема в том, что я запускаю множество событий, иногда поток не пробуждается с уведомлением(). Иногда обрабатывается 10 из 10 событий, иногда это 8 из 10 и так далее.
Я просматривал параллельную api, ища какую-то альтернативу для моей проблемы, но я не могу найти ничего хорошего. Не могли бы вы, ребята, дать мне совет о том, как противостоять этой проблеме?
Надеюсь, я хорошо объясню свою проблему. Если нет, спрашивайте.
Заранее спасибо.
FYI: 'this.stopped' должен быть' volatile', потому что он используется несколькими потоками. – Gray
'notify()' или 'notifyAll()'? – Raedwald