[英]Why is run() not immediately called when start() called on a thread object in java
[英]Java: Why method is not called when inside the thread?
我有一个方法:
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) {
}
}
}
最好的问候,瓦尔特·恩里克。
问题可能出在“oisAO”上吗? 如果您的 getPresentValue() 在线程外工作,它可能应该在新线程内工作。 这可能是您传递给 function 的内容。
需要明确的是:当您使用.start()
(使用多线程)调用代码时,会出现异常,而当您将threadAO.start()
更改为threadAO.run()
(没有多线程)时,它是否可以正常工作?
可能oisAO
在线程之间不同步:原始线程在.start( .start()
创建的新线程可以完成工作之前修改了oisAO的state(关闭套接字)。 要确定这是否是问题所在,您可以尝试在 threadAO.start() 之后添加一个threadAO.join()
(暂停当前线程直到新线程完成threadAO.start()
。
如果这是问题所在,您应该多考虑一下以找到正确的解决方案,因为仅暂停原始线程可能会给您带来一些性能问题。 如果您暂停线程,它并不是真正的多线程,而基本上只是在两个线程上顺序运行的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.