首页 新闻 搜索 专区 学院

【菜鸟求助】java 锁 同步问题

1
悬赏园豆:10 [已解决问题] 解决于 2016-08-25 17:11

程序设计大概是这样的:我先发送报文,在接收到应答报文后,对应答报文进行检测操作。

遇到的问题:如下,sendMsg()后,因为RecvMsg()是自动回调函数,得等待RecvMsg()被调用收到应答报文后,才能checkRespMsg(),这中间需要锁或者什么来同步一下,该怎么做?

public static void main(String[] args){
  sendMsg();
  //这里该写什么
  checkRespMsg();
}

 

public static void RecvMsg(){
  //这里该写什么
}

 

Gotogoo的主页 Gotogoo | 初学一级 | 园豆:147
提问于:2016-08-24 16:58
< >
分享
最佳答案
0

sendMsg()和RecvMsg()都是同步的吗?是的话就不用加锁吧;若不是同步的可以将返回报文放到队列、集合中,取出报文进行校验,个人愚见

收获园豆:4
程序猿在路上 | 初学一级 |园豆:165 | 2016-08-25 11:01

 异步的。因为要for循环发好多报文,而且先发不一定能先收到,队列最后检测会出问题。

我用wait()和notify()同步了一下,解决了。

Gotogoo | 园豆:147 (初学一级) | 2016-08-25 17:10
其他回答(4)
0

不要把简单的事情弄复杂,你应该这样子写,就可以轻松地解决你的问题了,不要乱加什么锁。

public static void main(String[] args){
  sendMsg();
}
public static void RecvMsg(){
   //收到数据后 
  //就检查 收到的数据。
  checkRespMsg();
}

 

收获园豆:3
田麦成 | 园豆:1984 (小虾三级) | 2016-08-24 17:03

我之前也是这样想的,但是checkRespMsg()需要参数,RecvMsg()因为是其他人写的jar包里的回调函数,无法提供该参数;不然就要用全局变量了。而我也想学习一下锁和同步问题,就是这样

支持(0) 反对(0) Gotogoo | 园豆:147 (初学一级) | 2016-08-24 17:16

@Gotogoo:如果你是C#写的话,我可以轻松解决,无奈 我不懂java

支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2016-08-24 17:21
0

RecvMsg 与main 无任何关联。 还是加个标志吧  

laugher_ccc | 园豆:593 (小虾三级) | 2016-08-25 09:27

 这里该怎么同步啊,求大神指教

支持(0) 反对(0) Gotogoo | 园豆:147 (初学一级) | 2016-08-25 09:47
0

搜一下java的future

收获园豆:3
伪善者ql | 园豆:250 (菜鸟二级) | 2016-08-25 10:56
0

public static void RecvMsg(){  checkRespMsg();  }  这样不行?

加洲旅馆2012 | 园豆:503 (小虾三级) | 2016-08-25 17:06

下一个发送的报文会用到前一个报文的应答,sendMsg()是for循环发送的,这样会出现发了两三个报文,才收到第一个报文的应答,而且后面发送的报文会出错

支持(0) 反对(0) Gotogoo | 园豆:147 (初学一级) | 2016-08-25 17:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册