gpt4 book ai didi

Java多线程I/0和通信问题

转载 作者:行者123 更新时间:2023-11-30 05:04:12 28 4
gpt4 key购买 nike

我正在使用java创建一个网络管理应用程序。在此应用程序中,我使用 SNMP4j 库(用于 snmp 协议(protocol))与网络设备建立通信。因此,我应该使用此协议(protocol)扫描网络设备的某些值并将结果放入文件中进行缓存。在某些时候,我决定使我的应用程序成为多线程并将设备分配给线程。我创建了一个实现可运行接口(interface)的类,然后扫描我想要为每个设备提供的值。

当我单独运行这个类时,它工作得很好。但是当我同时放置多个线程时,输出会变得困惑,它会将额外的或无序的输出打印到文件中。现在,我想知道这个问题是由于 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 = el

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 = el

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));
}

最佳答案

我怀疑 SNMPV1Communicator(device) 不是线程安全的。正如我所看到的,它不是 SNMP4j 库的一部分。

关于Java多线程I/0和通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680454/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com