我现在做UDP通信,发每一帧数据 都要等应答 。我接收到数据都会将数据放在全局变量里我发完一帧数据 等应答的时候 就在死循环里判断那个全局变量是否是我要应答,是了就跳出死循环,否则知道超时退出。就好比是这样     send();//发送数据
  waitAck();//等待应答public  waitAck(){
while(true){
if(Strack.equal("myAck"));//如果是我要的应答 我就break; 当然没有的等到 我就超时退出,这里没有超时的代码
break;
}
}这种方式虽然可行  但是死循环使得CPU的使用率变的很高,浪费了资源,所以我想在等应答的时候先wait();挂起等待应答的循环,直到接收数据线程收到数据,才唤醒我挂起的等应答线程,在让循环往下执行一次去判断接受到得数据,若不是我要等的应答,再挂起不过不知道要如果做,总之我不想一直循环着等,我想有接收到数据才就行一次节省CPU的开销,高手们帮帮我

解决方案 »

  1.   

    可以利用wait notify来实现。楼主可以网上查一下。大体流程是这样的:监听是否有包 ,有,处理,无,wait。
    接受数据包,收到后,notify,唤醒等待线程。jdk1.5之后,加了concurrent,也可以利用blockqueue来做,收到包放到blockqueue里面,另外一个线程专门从queue里取数据
      

  2.   

    两个专门的线程...一个专门读,一个专门写,两个专门的队列,一个用于存放要写的数据..一个用于存放要读的数据...数据到达之后notify等待操作的线程.
      

  3.   

    用wait,notify挂起唤醒监听线程
      

  4.   

    Sharpen your code-java高级群:78455879欢迎您的加入...
      

  5.   

    应用层的协议是tcp协议,不过是短连接,我发完命令就断开连接,然后等应答,对方回应答是重新connect我。反之亦然至于为什么要用短连接,就是有一定历史遗留问题了我发送命令 要等应答。
    我的监听端口只有一个,这个端口接收的数据后判断  要是应答帧 就赋值给全局变量,要是请求帧,在另处理。
    我等应答的时候,是在send之后,阻塞在while里判断那个全局变量直到超时