Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决声纳问题“删除此呼叫以“等待”或将其移动到“while”循环中”?_Java_Multithreading_Sonarqube - Fatal编程技术网

Java 如何解决声纳问题“删除此呼叫以“等待”或将其移动到“while”循环中”?

Java 如何解决声纳问题“删除此呼叫以“等待”或将其移动到“while”循环中”?,java,multithreading,sonarqube,Java,Multithreading,Sonarqube,我收到一个在遗留项目中修复声纳问题的请求,有这样一个代码段,对该函数的每次调用都将暂停50毫秒: synchronized(monitor) { [...] try { [...] Thread.sleep(config.getWaitTime()); // return 50 } catch (SomeException e) { log.error(e.getMessage(), e); } [...] } 首先,sonar要求我更改T

我收到一个在遗留项目中修复声纳问题的请求,有这样一个代码段,对该函数的每次调用都将暂停50毫秒:

synchronized(monitor) {

  [...]

  try {

    [...]

    Thread.sleep(config.getWaitTime()); // return 50
  } catch (SomeException e) {
    log.error(e.getMessage(), e);
  }

  [...]
}
首先,sonar要求我更改Thread.sleep以等待,因此我将try块更改为:

try {

  [..]

  monitor.wait(config.getWaitTime());
} catch (SomeException e) {
  log.error(e.getMessage(), e);
}
然后,出现了另一个问题:删除此调用以等待或将其移动到while循环中,我对多线程处理没有太多经验,因此我不确定我的修复是否正确:

boolean wait = true;
while (wait) {
  wait = false;
  monitor.wait(config.getWaitTime());
}
上述解决方案正确吗?如果没有,我该怎么办?

来自

线程也可以在不被通知、中断或删除的情况下唤醒 超时,所谓的虚假唤醒。但这种情况很少发生 在实践中,应用程序必须通过测试 导致线程被唤醒的情况,以及 如果条件不满足,则继续等待。换句话说,, 等待应始终在循环中发生,如下所示:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait(timeout);
     ... // Perform action appropriate to condition
 }
当不再需要等待条件时,必须从别处设置wait变量

此时,while似乎无能为力:

boolean wait = true;
while (wait) {
  wait = false;
  monitor.wait(config.getWaitTime());
}
wait语句周围的while语句旨在检查如果while中的逻辑/函数条件为true,则是否重新调用wait,但在您的情况下,当您将wait指定为false作为while主体的第一个语句时,它永远不会被调用。 这段时间是如此无助。 以下是与以下各项相关的信息:

线程也可以在不被通知、中断或删除的情况下唤醒 超时,所谓的虚假唤醒。但这种情况很少发生 在实践中,应用程序必须通过测试 导致线程被唤醒的情况,以及 如果条件不满足,则继续等待

通常我一点也不相信声纳的建议。。。。 您可以使用计时器来检查所需的时间是否已过。但是。 我建议您保持适合您要求的螺纹方式。 或者,如果您想让工具API添加代码。我当然是在开玩笑:别那么做

声纳让我换线。睡眠等待


别理声纳。这是误报。

在与我的技术负责人讨论后,他同意如果更改已经工作的并发代码可能会有高风险,并告诉我忽略此问题。他完全正确。另一个不这样做的理由。
boolean wait = true;
while (wait) {
  wait = false;
  monitor.wait(config.getWaitTime());
}