Это относится ко всем языкам:
Вы хотите иметь модель события / слушателя. Вы создаете слушателя, чтобы ждать определенного события. Событие будет создано (или сигнализировано) в вашем рабочем потоке. Это будет блокировать поток до тех пор, пока сигнал не будет получен, вместо того, чтобы постоянно опрашивать, чтобы увидеть, выполнено ли условие, например, решение, которое вы в настоящее время имеете.
Ваша ситуация является одной из наиболее распространенных причин взаимоблокировок - убедитесь, что вы сигнализируете другому потоку независимо от возможных ошибок. Пример - если ваше приложение выдает исключение - и никогда не вызывает метод, чтобы сообщить другому, что все завершено. Это сделает так, чтобы другой поток никогда не «проснулся».
Я предлагаю вам изучить концепции использования событий и обработчиков событий, чтобы лучше понять эту парадигму, прежде чем приступить к реализации вашего случая.
В качестве альтернативы вы можете использовать блокирующий вызов функции, используя мьютекс, который заставит поток ожидать освобождения ресурса. Для этого вам нужна хорошая синхронизация потоков, например:
Thread-A Locks lock-a
Run thread-B
Thread-B waits for lock-a
Thread-A unlocks lock-a (causing Thread-B to continue)
Thread-A waits for lock-b
Thread-B completes and unlocks lock-b