线程的挂起与唤醒的问题

lwx_work 2009-05-08 11:12:05
我现在做UDP通信,发每一帧数据 都要等应答 。我接收到数据都会将数据放在全局变量里

我发完一帧数据 等应答的时候 就在死循环里判断那个全局变量是否是我要应答,是了就跳出死循环,否则知道超时退出。

就好比是这样

send();//发送数据
waitAck();//等待应答

public waitAck(){
while(true){
if(Strack.equal("myAck"));//如果是我要的应答 我就break; 当然没有的等到 我就超时退出,这里没有超时的代码
break;
}
}

这种方式虽然可行 但是死循环使得CPU的使用率变的很高,浪费了资源,所以我想在等应答的时候先wait();挂起等待应答的循环,直到接收数据线程收到数据,才唤醒我挂起的等应答线程,在让循环往下执行一次去判断接受到得数据,若不是我要等的应答,再挂起。。。不过不知道要如果做,。。。总之我不想一直循环着等,我想有接收到数据才就行一次。。。节省CPU的开销,高手们帮帮我
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobao04551 2009-05-09
  • 打赏
  • 举报
回复
两个专门的线程...一个专门读,一个专门写,

两个专门的队列,一个用于存放要写的数据..一个用于存放要读的数据...数据到达之后notify等待操作的线程.
thereisawill 2009-05-09
  • 打赏
  • 举报
回复
Sharpen your code-java高级群:78455879欢迎您的加入...
云上飞翔 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 lwx_work 的帖子:]
我现在做UDP通信,发每一帧数据 都要等应答 。我接收到数据都会将数据放在全局变量里

我发完一帧数据 等应答的时候 就在死循环里判断那个全局变量是否是我要应答,是了就跳出死循环,否则知道超时退出。

就好比是这样

send();//发送数据
waitAck();//等待应答

public waitAck(){
while(true){
if(Strack.equal("myAck"));//如果是我要的应答 我就break; 当然没有的等到 我就超时退出,这里没有超时的…
[/Quote]
答:与线程无关。程序的结构问题。请楼主先仔细说明:双方的应用层通信协议倒底是什么?(你只模糊地只了一下“通信时序”的关系,不很明白)。
只有这一点明白了,下边才谈到程序的问题。否则这个样子,别人无法真正帮上你的忙。会浪费楼主及别人的时间。
nyzlhao 2009-05-09
  • 打赏
  • 举报
回复
有一个开源的jar,你看看Mina
steven123oscar 2009-05-09
  • 打赏
  • 举报
回复
用wait,notify挂起唤醒监听线程
lwx_work 2009-05-09
  • 打赏
  • 举报
回复
应用层的协议是tcp协议,不过是短连接,我发完命令就断开连接,然后等应答,对方回应答是重新connect我。反之亦然

至于为什么要用短连接,就是有一定历史遗留问题了。。。

我发送命令 要等应答。


我的监听端口只有一个,这个端口接收的数据后判断 要是应答帧 就赋值给全局变量,要是请求帧,在另处理。


我等应答的时候,是在send之后,阻塞在while里判断那个全局变量。。。直到超时
wuzhongxing 2009-05-08
  • 打赏
  • 举报
回复
可以利用wait notify来实现。楼主可以网上查一下。大体流程是这样的:

监听是否有包 ,有,处理,无,wait。
接受数据包,收到后,notify,唤醒等待线程。

jdk1.5之后,加了concurrent,也可以利用blockqueue来做,收到包放到blockqueue里面,另外一个线程专门从queue里取数据

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧