首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号量tryAcquire()方法不会立即返回

信号量tryAcquire()方法不会立即返回
EN

Stack Overflow用户
提问于 2019-10-13 06:21:42
回答 1查看 571关注 0票数 0

信号量中的tryAcquire(long timeout, TimeUnit unit)方法不会立即返回。线程不会被阻塞,并且允许所有线程获取该信号量,即使其中一个线程正在获取该信号量。我正在尝试实现发布消息的流控制,当代理通知订阅者关于同一主题的上一条发布消息的状态信息更改时。

我让第一个获取信号量的线程在释放信号量之前休眠10秒,同时,我让另一个线程获取信号量,而第一个线程还在休眠10秒,第二个线程仍然可以获取信号量。如果信号量不可用,我希望程序立即返回。不知道出了什么问题。任何建议都会很有帮助。

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-13 06:53:53

信号量中的

tryAcquire(long timeout, TimeUnit unit)方法不会立即返回。

不应该是这样的。如果您阅读文档,即javadoc,您会发现:

如果没有可用的许可,则当前线程出于线程调度目的而被禁用,并且处于休眠状态,直到发生以下三种情况之一:

指定等待时间or

  • The指定等待时间elapses.

;指定等待时间

  • 某个其他线程为此信号量调用

()方法,下一个分配给当前线程的是许可;或者指定等待时间其他线程中断当前线程

如果您希望它立即返回,请调用tryAcquire() (不带参数):

如果没有可用的许可,则此方法将立即返回值为false

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58359053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档