Java:使用带计时器的信号量

Java:使用带计时器的信号量,java,timer,semaphore,Java,Timer,Semaphore,您好,我正在尝试使用semaphore.aqcuire()和semaphore.release()同步类。我正在从名为ReadSerialPort的类调用semaphore.release()并从WriteSerialPort调用semaphore.aqcuire()以将电话中心连接到PC。我的问题是电话中心并不总是响应 我想知道一种在时间过去后设置计时器并生成semaphore.release()的方法 附言:我尝试使用TimedSemaphore类,但什么也没发生Jan Goynvaeis使

您好,我正在尝试使用
semaphore.aqcuire()
semaphore.release()
同步类。我正在从名为
ReadSerialPort
的类调用
semaphore.release()
并从
WriteSerialPort
调用
semaphore.aqcuire()
以将电话中心连接到PC。我的问题是电话中心并不总是响应

我想知道一种在时间过去后设置计时器并生成
semaphore.release()
的方法


附言:我尝试使用
TimedSemaphore
类,但什么也没发生

Jan Goynvaeis使用semaphore.tryAcquire(10,TimeUnit.SECONDS)解决了我的问题,因此采集将在10秒后超时。超时后,im使用semaphore.release(0)清除线程

将逻辑置于获取端是一个选项吗?还有信号量。tryAcquire(超时)您描述的模式没有真正意义。您需要确保以“正常”的方式调用
release()
,并根据需要在保留期间阻塞调用时使用超时。(如果没有代码和共享资源的概要以及它们发生了什么,很难告诉您如何解决您的问题。)在计时器上释放信号量可能会让事情以一种不好的方式中断,因为我认为这是有原因的。您通常会尝试在超时的情况下获取该信号,如果持有该信号量的线程不返回该信号量,则放弃。这样,你就会知道某些东西挂起了,而不会认为它是以正常的方式发布的。换言之:如果代码中有一个信号量从未发布过,那就是一个bug,你需要修复它的原因,而不是试图想出一个解决办法。事实上,您询问的是(糟糕的)解决方法,这也意味着这个问题反映了XY问题,需要改进或关闭。@milimoose:问题是,我正在调用Semaphore.acquire,等待电话中心响应,在那里我正在调用Semaphore.release。事实上,电话中心并不总是有响应,所以我想在一段时间后调用Semaphore.release()。