The main place is interesting for me is ListenThread implements WorkerTask. snmp.listen() starts ListenThread and inside run method of it socket receives packages: socketCopy.receive(packet).
If we speak about one Snmp object for concurrent environment/app:
Do we have ability to plan when socketCopy.receive(packet) become (if become) a bottleneck?
Other potential places to be bottleneck candidates in such architecture?
Before the Socket becomes the bottleneck, usually the code that processes the data in the application gets performance issues.
Before that, however, the UDP buffer of the OS could get flooded and then you will loose packets there.
Then it is time to increase the buffer or use more different sockets. But in any case, you can use a single Snmp instance with several transport mappings.
Then you can use the MultiThreadedMessageDispatcher to distribute the dispatching load to several CPUs.
Before you actually need that, using multiple threads is always an overhead and reduces performance.