@synapse_people

Как синхрозизировать метод входа?

Имеется удаленный сервер, при подключении к нему с него грузится объект входа(объект и объект, не более и все тут), затем этому объекту можно будет послать метод входа, который войдет на удаленном сервере в аккаунт, соотв. ответ тоже приходит в другом потоке. Получается, объект грузится в 1 потоке, метод входа вызывается в другом, ответ приходит в третьем. А нужно это ответ о результате собрать в 1 поток, в тот, в котором метод входа вызывался и вернуть ответ там же. ВАЖНО: Сервак может и не ответить, так что слушатели не вариант, да и вызыватся они будут в разных потоках..

Как я пытался делать: Вариант 1, при помощи Semaphore.
Я сделал по 1 семафору для каждого события: объект загружен, есть ответ от сервера о входе, аккаунт загружен(итого = 3 семафора).
То есть схема в этом случае такая: Я захватываю первый семафор(метод входа), отправляю пакет на сервер и захватываю семафор, что ответ от сервера пришел, потом его проверяю и захватываю еще 1 семафор, что аккаунт(профиль) загружен.
Как-ой то костыль в общем.
Вариант 2 reentrantlock и condition.
Тут я создаю 1 лок для метода входа и 2 условия, первое - что пришел ответ от сервака, второе - акк загрузился.
private final Lock loginLock = new ReentrantLock(true);
private final Condition whenLoginResponse = loginLock.newCondition();
===========================
//Колбэк нужно вызвать в том же потоке, в котором вызывали doLogin.
public void doLogin(String login, String password, final LoginResultCallback callback) {
	loginLock.lock();//локаем метод, чтобы другие потоки не могли вызвать метод входа. Верно же?

	try {
		... некоторые проверки, чтобы в акк уже не вошли ...
		... отправка пакета ВХОДА на сервер ...

		... ждем ответ с сервера...
		whenLoginResponse.await(); <- Тут ничего не отпускает(дальше не идет),
почему-то ждет вечно, хотя whenLoginResponse.signal() был вызван 100%.

		... логика проверок ответа от сервера (верный ли был пароль, логин, не в блоке
 ли акк и т.д.) ...

		... тут по аналогии с whenLoginResponse.await() нужно подождать загрузки профиля...

		callback.onLoginOk(client); <- тут вызывается метод, что в акк зашло.
		ИЛИ не зашло(не важно):
		callback.onLoginFailed(client, LoginFailedCause.BLOCKED, null);
	} finally {
		loginLock.unlock();
	}
}

Когда с сервера приходит ответ, то вызывается метод signal:
whenLoginResponse.signal();
Помогите советами и псевдо-кодом. Заранее спасибо!
UP: Еще раз, нужно так, чтобы колбэк был вызван в том же потоке, который вызывал doLogin, при этом, чтобы пока идет процесс входа другие потоки НЕ могли вызывать doLogin параллельно..
  • Вопрос задан
  • 254 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы