SNMP的异步发送为什么还需要synchronized

最近在研究SNMP协议.也下载了SNMP4J源码看了一遍.对SNMP4J的基本操作包括GET/SET/GETNEST等有了较为熟悉的运用.
但是对SNMP4J提供的异步操作,我始终不明白.
按照JAVA DOC上提供的代码,要异步发送SNMP消息,就需要实现ResponseListener监听器.该监听器意味着当有response返回的时候,就会执行onResponse()方法:

ResponseListener listener = new ResponseListener(){

public void onResponse(ResponseEvent event){
( (Snmp)event.getSource()).cancel(event.getRequest(),this);
System.out.println("response: "+event.getResponse());
}
};

接着发送GETNEXT命令:

snmp.getNext(pdu, target, null, listener);
snmp.close();

但是结果是null.我使用抓包工具Wireshark抓包的时候却显示有response返回!
那为什么onResponse()打印不出来呢?

后来我参考了org.snmp4j.tools.console下的SnmpRequest.java中的table()方法.
在上面的代码外包一层synchronized,如:

synchronized(this){
ResponseListener listener = new ResponseListener(){

public void onResponse(ResponseEvent event){
( (Snmp)event.getSource()).cancel(
event.getRequest(),this);
System.out.println("response: "+event.getResponse());
}
};
snmp.getNext(pdu, target, null, listener);
this.wait(5);
}
snmp.close();

之后再运行,可以抓到包,ResponseEvent也接收到了数据.


加了synchronized之后,代码就表明了每次发送request之后,我就需要等待一段时间;才能发送下一条request.这样的异步和我直接使用同步即"[color=red]发送request--等待respose[/color]"模式有什么差异呢?为什么还要等待?


渴望高人指点,欢迎各同仁讨论.非常感谢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值