【发布时间】:2011-08-06 12:45:23
【问题描述】:
我正在使用 java 创建一个用于网络管理的应用程序。在这个应用程序中,我使用 SNMP4j 库(用于 snmp 协议)与网络设备建立通信。因此,我应该使用此协议扫描网络设备的某些值并将结果放入文件中进行缓存。在某些时候,我决定让我的应用程序多线程,并将设备分配给线程。我创建了一个实现可运行接口的类,然后为每个设备扫描我想要的值。
当我单独运行这个类时,它工作正常。但是当我同时放置多个线程时输出混乱,它会将额外的或无序的输出打印到文件中。现在,我想知道这个问题是由于 I/O 还是由于通信造成的。
这里我会放一些代码,这样你就可以看到我在做什么并帮助我找出问题所在。
public class DeviceScanner implements Runnable{
private final SNMPCommunicator comm;
private OutputStreamWriter out;
public DeviceScanner(String ip, OutputStream output) throws IOException {
this.device=ip;
this.comm = new SNMPV1Communicator(device);
oids=MIB2.ifTableHeaders;
out = new OutputStreamWriter(output);
}
@Override
public void run(){
//Here I use the communicator to request for desired data goes something like ...
String read=""
for (int j=0; j<num; j++){
read= comm.snmpGetNext(oids);
out.write(read);
this.updateHeaders(read);
}
out.flush();
//...
}
}
一些预期的输出将类似于:
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
1.3.6.1.2.1.1.3.0 = 26 天,22:35:02.31
1.3.6.1.2.1.1.4.0 = 管理员
1.3.6.1.2.1.1.5.0 = 埃尔斯
1.3.6.1.2.1.1.6.0 = 电脑室
但我得到的却是(不定):
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
1.3.6.1.2.1.1.4.0 = 管理员
1.3.6.1.2.1.1.5.0 = 埃尔斯
1.3.6.1.2.1.1.3.0 = 26 天,22:35:02.31
1.3.6.1.2.1.1.6.0 = 电脑室
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
*目前我需要每个设备扫描仪一个文件。 我从 ip 列表中获取它们,它看起来像这样。我还使用一个小线程池来同时保持有限数量的线程。
for (String s: ips){
output= new FileOutputStream(new File(path+s));
threadpool.add(new DeviceScanner(s, output));
}
【问题讨论】:
-
如果您发布一个完整但最小的(可编译但仅显示问题所需的内容)示例,它会很有帮助;也就是说,您可能想研究“同步”的方法或语句。
-
我还建议学习输出流缓冲和
flush() -
输出是一个巨大的文件,我可能不应该在网上发布(包含私有网络数据),但正如我所提到的,它重复了一些输出并且将其随机排列。
-
@Jim 我想知道,因为我在刷新之前放置了大量数据,它有限制吗?有没有更好的输出方式?
-
如果没有看到至少一个样本来说明输出与您的预期有何不同,很难提出具体的建议。
标签: java multithreading sockets io