Многопоточная программа Java зависаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Многопоточная программа Java зависает

Сообщение Anonymous »

Попытка имитировать программу обработки событий с использованием многопоточности. Цель состоит в том, чтобы сохранить порядок генерируемых исходных событий. Использование минимальной кучи для поддержания порядка.
-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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»