我有一个方法:
public String getPresentValue(ObjectIdentifier oid) throws Exception {
ReadPropertyRequest rpr = new ReadPropertyRequest(oid, PropertyIdentifier.presentValue);
ReadPropertyAck rpa = (ReadPropertyAck) localDevice.send(isa, null, 1476, Segmentation.segmentedBoth, rpr);
return rpa.getValue().toString();
}
当我在线程之外调用它时,它工作得很好,但是当我尝试在线程内部调用它时,没有任何反应。
为什么会这样?
更新
public void active(Supervisory supervisory) {
//.. my code above is just simple maths
System.out.println("presentValue in the thread" + getPresentValue(oi));
ScanAO scanAO = new ScanAO();
Thread threadAO = new Thread(scanAO);
threadAO.start();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
class ScanAO extends Thread {
public void run() {
try {
for (ObjectIdentifier oi : oisAO) {
System.out.println("presentValue in the thread" + getPresentValue(oi));
}
} catch (Exception e) {
}
}
}
祝你好运, Valter Henrique。
答案 0 :(得分:0)
问题可能与“oisAO”有关吗?如果你的getPresentValue()在线程之外工作,它应该可以在新线程内部工作。这可能是你传递给函数的内容。
答案 1 :(得分:0)
为了清楚起见:当您使用.start()
(使用多线程)调用代码时,您会收到异常并将threadAO.start()
更改为threadAO.run()
(无多线程)它运作正常吗?
线程之间可能没有同步oisAO
:原始线程在.start()
创建的新线程可以完成其工作之前修改oisAO的状态(关闭套接字)。要确定这是否是问题,您可以尝试在threadAO.join()
之后添加threadAO.start()
(暂停当前线程,直到新线程完成)。
如果这是问题所在,您应该更多地考虑找到正确的解决方案,因为暂停原始线程可能会给您带来一些性能问题。如果你暂停线程它不是真正的多线程,但基本上只是代码在两个线程上顺序运行。