2012-07-12 8 views
6

Por ejemplo, quiero reproducir este hilo en Jython porque necesito iniciar mi statemachine desde una API de Java. No tengo mucho conocimiento en Jython. ¿Cómo puedo hacer eso?¿Cómo podría usar hilos de Jython ya que eran hilos de Java?

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

Así que estoy tratando de hacer algo como esto:

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() 

PD: Ya he intentado hacer lo que se ha comentado en el marco del foo.run()

¿Qué estoy haciendo mal?

Respuesta

2

Bueno, dejando a un lado el hecho de que está llamando el método start() desde dentro del método run(), que es una muy mala idea porque una vez que se inicia un hilo, si intenta iniciar de nuevo obtendrá una excepción de estado de subproceso , dejando de lado eso, el problema es, muy probablemente, que estés usando la biblioteca de threads de Jython y no la de Java.

Si se asegura de importar de la siguiente manera:

from java.lang import Thread, InterruptedException 

En lugar de

from threading import Thread, InterruptedException 

Y si corrige el problema que he citado anteriormente, lo más probable es que su código se ejecutará bien.

Usando threading biblioteca del Jython, que tendría que cambiar el código un poco, algo así como:

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() 

que parece funcionar para mí.

+0

Muchas gracias, creo que mi problema no fue con el hilo y solo con mi statemachine. ¡Muchas gracias por su atención! – hudsonsferreira