-generateEvent() создает порядковый номер событий, начиная с 1.
-после создания поместите порядковый номер в минимальную кучу.
-processEvent() должен запускаться в параллельно
-postprocessEvent() нужно обрабатывать события в порядке создания
Но почему-то программа зависает 2 раза из 10.
Вызывающая функция:
Код: Выделить всё
ExecutorService service = Executors.newFixedThreadPool(2);
WorkerThread workerThread = new WorkerThread(eventSource, processedEventHandler, eventProcessor, minHeap);
try {
for (int i = 0; i < eventCount; i++) {
service.execute(workerThread);
}
} finally {
service.shutdown();
while (!service.isTerminated()) {
;
}
}
Код: Выделить всё
private synchronized Event generateEvent() {
Event event = eventSource.getNextEvent();
minHeap.offer(event.getSeqNum());
System.out.println(Thread.currentThread().getName() + ": generating event " + event.getSeqNum());
return event;
}
private synchronized void postProcessEvent(final ProcessedEvent processedEvent) {
if (minHeap.peek().equals(processedEvent.getSeqNum())) {
minHeap.poll();
processedEventHandler.handleProcessedEvent(processedEvent);
System.out.println(Thread.currentThread().getName() + ": PostprocessedEvent " + processedEvent.getSeqNum());
}
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Started");
Event event = generateEvent();
ProcessedEvent processedEvent = eventProcessor.processEvent(event);
System.out.println(Thread.currentThread().getName() + ": ProcessedEvent " + processedEvent.getSeqNum());
while (true) {
if (minHeap.peek().equals(processedEvent.getSeqNum())) {
postProcessEvent(processedEvent);
break;
}
}
System.out.println(Thread.currentThread().getName() + " Finished");
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... gram-hangs
Мобильная версия