Java:使用定时器与信号量

5
你好,我正在尝试使用semaphore.acquire()semaphore.release()同步类。我从名为ReadSerialPort的类中调用semaphore.release(),并从WriteSerialPort中调用semaphore.acquire()来连接电话中心与电脑。我的问题是电话中心不总是响应。
我想知道一种设置计时器并在时间过去后执行semaphore.release()的方法。
附注:我尝试使用TimedSemaphore类,但没有任何反应。

5
可以将逻辑放在获取方吗?这里使用的是 Semaphore.tryAcquire(timeout)。 - Jan Goyvaerts
1
你描述的模式并没有太多意义。你需要确保以“正常”的方式调用release(),并在持有时根据需要使用超时来阻塞调用。(如果没有代码和共享资源的概述以及它们的情况,很难确定如何解决你的问题。) - millimoose
1
在计时器上释放信号量可能会以糟糕的方式导致事情出错,因为我认为它被获取的原因是有原因的。通常你要做的是尝试使用超时来获取它,并且如果持有信号量的线程不归还它,则放弃。这样,您将“知道”某些东西挂起并且不认为它以正常方式释放。 - Joachim Isaksson
@milimoose:问题在于我正在调用Semaphore.acquire来等待电话中心的响应,在那里我调用了Semaphore.release。事实是电话中心并不总是会响应,所以我想在一段时间后调用Semaphore.release()。 - Konstantinos Bonis
@Jan Goyvaerts:我认为你提供的解决方案会起作用,于是尝试了semaphore.tryAcquire(10, TimeUnit.SECONDS); 但它并没有终止。 - Konstantinos Bonis
显示剩余5条评论
1个回答

10

我的问题的答案是由Jan Goynvaeis使用semaphore.tryAcquire(10,TimeUnit.SECONDS)解决的,因此在10秒后获取将超时。超时后,我使用semaphore.release(0)来清除线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接