例如,我想在Jython中重现这个Thread,因为我需要从Java API启动我的 statemachine 。我在Jython中没有太多的知识。我怎样才能做到这一点?
Thread thread = new Thread() {
@Override
public void run() {
statemachine.enter();
while (!isInterrupted()) {
statemachine.getInterfaceNew64().getVarMessage();
statemachine.runCycle();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
interrupt();
}
}
}
};
thread.start();
所以我正在尝试这样的事情:
class Cycle(Thread, widgets.Listener):
def run(self):
self.statemachine = New64CycleBasedStatemachine()
self.statemachine.enter()
while not self.currentThread().isInterrupted():
self.statemachine.getInterfaceNew64().getVarMessage()
self.statemachine.runCycle()
try:
self.currentThread().sleep(100)
except InterruptedException:
self.interrupt()
self.start()
foo = Cycle()
foo.run()
#foo.start()
PS:我已经尝试过做foo.run()
下的评论我做错了什么?
答案 0 :(得分:2)
好吧,撇开你在start()
方法中调用run()
方法的事实,这是一个非常糟糕的主意,因为一旦线程启动,如果你再次尝试启动它你会得到一个线程状态异常,把它放在一边,问题很可能是你使用的是Jython线程库,而不是Java。
如果您确保按以下方式导入:
from java.lang import Thread, InterruptedException
而不是
from threading import Thread, InterruptedException
如果你纠正了我上面提到的问题,很可能你的代码运行得很好。
使用Jython的threading
库,您需要稍微更改一下代码,有点像:
from threading import Thread, InterruptedException
import time
class Cycle(Thread):
canceled = False
def run(self):
while not self.canceled:
try:
print "Hello World"
time.sleep(1)
except InterruptedException:
canceled = True
if __name__ == '__main__':
foo = Cycle()
foo.start()
这似乎对我有用。