Я попытался создать диспетчер событий в Java, который будет отправлять события как потоки. Таким образом, все классы EventListener по существу реализованы классом Runnable. Как и в случае традиционного запуска событий, метод в классе диспетчера событий проходит по списку EventListeners и затем вызывает их метод-обработчик, за исключением того, что на этот раз я вызываю эти обработчики как потоки, помещая слушатели в новый поток (handlerObject). Начните(). Фактическая обработка выполняется в методе run () в EventListener.
Так это выглядит примерно так:
for(EventListener listener : listenerList) {
if(listener instanceof Runnable)
new Thread(listener).start();
}
Таким образом, все инструкции для обработки события в слушателе помещены в метод run (), который будет выполняться, когда thread.start ().
Но проблема в том, что потоки часто оказываются в ситуации, когда один из потоков застрял где-то и не смог продолжить. Иногда несколько потоков могут также зависнуть, в то время как некоторым удалось выполнить все инструкции метода run () в слушателе. Я посмотрел вверх, и это звучит как то, что называется тупиком.
Я пытался установить модификатор "synchronized" для всех моих методов, но проблема все еще остается. Я думал, что ключевое слово synchronized просто поставит в очередь все потоки, пытающиеся запустить подобный метод, пока текущий поток, выполняющий метод, не завершится. Но это еще не решает проблему. Почему синхронизация не решает проблему, особенно если она у меня уже есть на всех моих методах, и она должна ставить в очередь любой параллельный доступ, который потенциально может вызвать взаимоблокировку? Я не использовал методы wait () или notify (). Просто простой диспетчер событий, который пытается запустить свой прослушиватель событий как поток.
Я довольно новичок в потоках, но мне было очень трудно даже отладить его, потому что я не знаю, в чем дело.
Спасибо за любую помощь.