2011-11-18 17 views
5

Considere esta clase, AnimationThread:¿Por qué se ejecuta run() solo una vez?

class AnimationThread implements Runnable { 
    public void pause() { 
     doAnimation = false; 
    } 

    public void doStart(){ 
     doAnimation = true; 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     if (doAnimation) { 
      //my code 
     } 

     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) { 

     } 
    } 
} 

Ahora estoy empezando este hilo en onCreate de una actividad (sólo mostrar código en bruto):

AnimationThread animRunnable = new AnimationThread(); 
animationThread = new Thread(animRunnable); 
animationThread.start(); 

Pero run() está siendo llamado una sola vez (Rastreé un registro para confirmar eso). Solo quiero saber que cuando comencé el hilo, por qué run() no recibe llamadas repetidas veces con 500 sleep. Simplemente se llama una vez.

Respuesta

12

Esa es la forma en que se supone que es.

Un subproceso se ejecuta al ejecutar su método de ejecución (solo una vez). Después de eso, se considera hecho/muerto/terminado/completado.

Si desea hacer un bucle, tiene que hacerlo usted mismo (dentro del método de ejecución), o usar algún ExecutorService para llamar al Runnable repetidamente.

+0

Gracias. Tengo la lógica. Me estoy asegurando de que dentro de mi código lógico se ejecute repetidamente. En realidad, en mi situación, quiero que run() ejecute infinitamente para mi propósito, así que he incluido mi lógica dentro de while (true) dentro de la ejecución y la animación se basa en el estado de la variable de estado doAnimation. Gracias. –

+0

Ese es un patrón común. Sin embargo, es probable que desee que el hilo termine eventualmente para apagar el programa. O podrías usar un hilo daemon para eso. – Thilo

8

Por supuesto, el método run() se ejecutará una vez. Si desea repetir las instrucciones dentro del método run, entonces debe usar el ciclo. Eche un vistazo al TimerTask - ejecutará una tarea a una hora específica o repetidamente.

EDIT:

  1. Android - Controlling a task with Timer and TimerTask?
  2. Timer task schedule
+0

Gracias. ¿Podrías por favor mostrarme un enlace de ejemplo? Por favor. –

+1

@ user925224 - He editado mi publicación. – adatapost

+0

+1 por dar lo que el usuario haya pedido ... – ngesh

0

run() es un método que se ejecuta una sola vez por cualquier Thread. Porque después de terminar run method El hilo es dead or completed.
Por lo que para una ejecución de subproceso se ejecutarán solo. Si no desea eliminar el hilo, debe asegurarse de que la ejecución finalice ...

Cuestiones relacionadas