Я пишу игру, в которой поток - GameThread - зацикливается навсегда, обновляет все мои спрайты, рендерит их, а затем спит некоторое время, прежде чем снова делать все это. У меня также есть специальный обработчик событий, который обрабатывает нажатия клавиш и т. Д.
В большинстве случаев все работает нормально. Однако у меня есть проблема, если событие генерируется во время рендеринга GameThread. В редких случаях обработчик, который имеет дело с событием, может вносить параллельные изменения в то, что должно быть отображено, влияя на результаты рендеринга GameThread.
Чтобы избежать этого, я хочу, чтобы обработчик событий немедленно приостановил GameThread, обработал событие и затем возобновил GameThread.
Методы suspend()
/ resume()
удовлетворяют моим потребностям, но они устарели. В моем случае, однако, поскольку вероятность тупиковых ситуаций мала, безопасно ли их использовать независимо от этого?
Если нет, какие у меня есть альтернативы, которые не требуют огромных накладных расходов?
Я видел предложение запросить приостановку потока, установив флаг в Потоке для приостановки. В моем случае, однако, я не считаю это приемлемым вариантом, поскольку цикл GameThread может занять некоторое время во время итерации цикла. Я не смогу проверить флаг, пока не закончу с циклом, и к тому времени будет слишком поздно.
Мне нужна немедленная пауза, иначе пользователь заметит задержку в обработке события.