信号量中的tryAcquire(long timeout, TimeUnit unit)方法不会立即返回。线程不会被阻塞,并且允许所有线程获取该信号量,即使其中一个线程正在获取该信号量。我正在尝试实现发布消息的流控制,当代理通知订阅者关于同一主题的上一条发布消息的状态信息更改时。
我让第一个获取信号量的线程在释放信号量之前休眠10秒,同时,我让另一个线程获取信号量,而第一个线程还在休眠10秒,第二个线程仍然可以获取信号量。如果信号量不可用,我希望程序立即返回。不知道出了什么问题。任何建议都会很有帮助。
try {
if(semaphore.tryAcquire(this.request_handling_time,
TimeUnit.MILLISECONDS)) {
updateResource(resource, request);
response = channel.createResponse(request, CoapResponseCode.Changed_204);
logger.info("content changed");
try {
if(request.getMaxAgeTopic()>=0) {
((PubSubTopic) resource).setmaxAgeTopicValue(request.getMaxAgeTopic());
}
}catch(NullPointerException ex){
if(((PubSubTopic) resource).getmaxAgeTopicValue() > 0){
((PubSubTopic) resource).updateTopicLifeTime();
}
}
resource.changed(); // send notifications to the subscribers
// send notifications to the pendingRequest Clients if present
if(((PubSubTopic) resource).getPendingSubscribe().size() > 0) {
((PubSubTopic) resource).notifyPendingRequest();
}
try {
Thread.sleep(10000);
}
catch (@SuppressWarnings("unused") InterruptedException e){
/*do nothing*/
}
semaphore.release();
}else {
logger.info("Too many requests on topic "+resource.getPath());
response = channel.createResponse(request,
CoapResponseCode.Too_Many_Requests_429);
response.setMaxAge(retry_time_after_too_many_requests);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
semaphore.release();
}发布于 2019-10-13 06:53:53
信号量中的
tryAcquire(long timeout, TimeUnit unit)方法不会立即返回。
不应该是这样的。如果您阅读文档,即javadoc,您会发现:
如果没有可用的许可,则当前线程出于线程调度目的而被禁用,并且处于休眠状态,直到发生以下三种情况之一::
指定等待时间or
;指定等待时间
()方法,下一个分配给当前线程的是许可;或者指定等待时间其他线程中断当前线程
如果您希望它立即返回,请调用tryAcquire() (不带参数):
如果没有可用的许可,则此方法将立即返回值为
false的。
https://stackoverflow.com/questions/58359053
复制相似问题