POJO属性改变听众 - 理想的方式

时间:2014-10-28 03:56:37

标签: java while-loop javabeans

我正在开发一个基于REST的Web应用程序,它将为某些数据异步调用第三个系统(使用websockets)。所以 浏览器 - &gt; REST - &gt;我的WebApp - &gt;另一个应用程序 - &gt;我的WebApp - &gt;浏览器 My WebApp与另一个APP之间的通信是异步的,我只能使用一些标识符跟踪请求的响应。 因此,我请求C为<counter>.C,响应将为<counter>.Response,其中两个计数器都相同。

要将响应映射到请求,我将命令,计数器,标志设置为bean。我保持一个while循环,继续检查标志是否已设置。一旦我得到响应,设置标志,while循环退出,我知道数据可用。

这是正确的方法吗?有没有办法让我做得更好,因为我觉得(我可能错了!)保持开放的while循环是不正确的。

类bean设置如下,

public void setAllProperties(){
 bean.setCommand(commandString);
 bean.setCounter(counter);
 bean.hasResponse(false);
}

网络服务中的代码段是

bean.setAllProperties();
sendToApplication(bean);
int checkCounter = 0;
while(!bean.hasResponse && checkCounter > 0){
  if(bean.hasResponse){
     checkCounter++;
     // loggers and other logic here
  }
}

1 个答案:

答案 0 :(得分:3)

循环失败了很多异步操作的值。它还消耗了大量的CPU时间(尝试添加延迟 - 快速睡眠 - 使用这样的循环时)。

我建议使用&#34; wait()&#34;和&#34;通知()&#34; /&#34; notifyAll()&#34;代替。

在等待回复的代码中,执行以下操作:

synchronized ( bean ) {
    while ( ! bean.hasResponse ) {
        bean.wait();
    }
}

在处理响应并更新bean的代码中:

synchronized ( bean ) {
    bean.hasResponse = true;
    bean.notifyAll();
}