2013-02-08 5 views
2

Привет, я пытаюсь синхронизировать классы, используя semaphore.aqcuire() и semaphore.release(). Я звоню semaphore.release() из класса с именем ReadSerialPort и semaphore.aqcuire() от WriteSerialPort для подключения телефонного центра к ПК. Моя проблема заключается в том, что телефонный центр не всегда отвечает.Java: Использование Семафора с таймером

Я хотел бы знать способ установить таймер и сделать semaphore.release() по прошествии времени.

P.S: Я попытался с помощью TimedSemaphore классов, но ничего не произошло

+5

было бы опцией поставить логику на сторону приобретения? есть Semaphore.tryAcquire (тайм-аут) –

+1

Образец, который вы описываете, на самом деле не имеет смысла. Вы должны убедиться, что 'release()' вызывается обычным образом и использует таймауты по мере необходимости для блокировки вызовов во время их хранения. (Очень сложно сказать, как исправить свои проблемы без кода и контуры общих ресурсов и что с ними происходит.) – millimoose

+1

Освобождение семафора на таймере может заставить вещи сломаться плохо, так как я предполагаю, что есть причина он был приобретен. То, что вы обычно делаете, это попытаться приобрести его с тайм-аутом и отказаться, если поток, содержащий семафор, не вернет его. Таким образом, вы будете что-то висели, а не думаете, что это было выпущено обычным способом. –

ответ

3

Ответ на мой вопрос был решен Ян Goynvaeis использованием semaphore.tryAcquire (10, TimeUnit.SECONDS) так приобретаемой будет тайм-аут через 10 секунд. После таймаута im с помощью semaphore.release (0), чтобы очистить поток

Смежные вопросы