最近在研究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.这样的异步和我直接使用同步即"
发送request--等待respose"模式有什么差异呢?为什么还要等待?
渴望高人指点,欢迎各同仁讨论.非常感谢!
分享到:
相关推荐
为什么使用 Synchronized 代码块 使用 Synchronized 代码块可以缩小同步的影响范围,提高程序的运行效率。同时,Synchronized 代码块也可以在一定时期内霸占某个对象的钥匙,避免其他线程访问该对象的上锁房间。 ...
"Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据...synchronized 关键字是 Java 语言中解决多线程共享数据同步问题的重要工具,但需要正确地使用它,以免造成死锁和系统开销。
在上面的例子中,MySubClass 中的 myMethod 方法不自动变成 synchronized 方法,需要显式地指定它为 synchronized 方法。 四、synchronized 关键字的使用示例 以下是一个简单的示例代码,演示了 synchronized ...
callback方法中,我们不需要做任何事情,因为Future对象已经处理了异步调用返回结果,而在call方法中,我们使用get方法来等待异步调用返回结果。 4. 使用CountDownLatch CountDownLatch是一种同步工具,通过使用...
在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...
- 当需要实现互斥访问或复合操作的原子性时,应选择使用`synchronized`。 - 在不确定如何选择时,优先考虑`synchronized`,因为它提供了更全面的保障,避免因使用不当导致的数据不一致性问题。 总之,在实际开发中...
如果只希望锁定代码块而非整个方法,可以使用`synchronized`代码块,指定锁定对象为`this`。这适用于当类中有多个`synchronized`方法,但不想全部锁定的情况: ```java public class MyClass { private int ...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...
除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...
- **实例方法**:可以直接将`synchronized`关键字放在实例方法前,此时该方法的锁为当前对象实例本身。 ```java public synchronized void method() { // 同步方法体 } ``` - 当一个线程调用此方法时,会锁定...
`synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...
除了同步方法之外,还可以通过`synchronized`关键字来同步一段代码块,这种情况下需要指定同步监视器(锁对象),例如: ```java public void method() { Object obj = new Object(); synchronized (obj) { // ...
《深入理解Java中的synchronized关键字》 在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要工具,它的本质在于确保多线程环境下的数据一致性与安全性。通过`synchronized`,我们可以控制对共享资源...
### synchronized关键字的深入解析 #### 一、synchronized关键字的重要...然而,使用`synchronized`也需要谨慎,不当的使用可能会导致性能下降或者死锁等问题。因此,在实际应用中,应根据具体情况合理选择同步策略。
需要注意的是,合理地使用`synchronized`不仅能够提高程序的并发性能,还能简化线程同步逻辑。但是过度使用或不当使用也可能导致性能下降或死锁等问题,因此在实际开发中需要根据具体情况谨慎选择。
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...
- **使用场景**:适用于需要异步获取计算结果的场景。 4. **CompletableFuture类**: - **作用**:提供了一种更加强大和灵活的方式来组合和构造异步流。 - **原理**:CompletableFuture是Future的子类,提供了更...
1. **什么是`synchronized`?** `synchronized`是Java中的一个关键字,用于实现线程同步,它主要解决多线程环境下共享资源的并发访问问题,防止出现数据不一致的情况。当多个线程试图同时访问同一块代码时,`...
为了更好地利用`synchronized`,需要考虑以下几点: - **锁定粒度**:尽可能减小同步的范围,只同步必要的代码,避免过多的同步导致性能下降。 - **死锁预防**:避免多个线程持有对方需要的锁,这可能导致死锁。 - ...