Configuración de un Runner de Java Thread después de la construcción

Los documentos JDK 7 Java sugieren los siguientes dos idiomas para crear subprocesos Java:

  1. Extender el subproceso y anular ejecutar ()

    class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } ... //And to launch the custom Thread PrimeThread p = new PrimeThread(143); p.start(); 
  2. Implementar Runnable y crear un nuevo Thread pasando el impl Runnable en su constructor

     class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } ... //And to launch a new Thread with this Runnable's behavior PrimeRun p = new PrimeRun(143); new Thread(p).start(); 

Estos son lo suficientemente bien, pero me gustaría ser capaz de crear una subclase de Thread y luego definir y establecer su ejecución Runnable algún tiempo más tarde (por ejemplo, no sólo en el constructor del hilo). Por lo que puedo decir, la clase Thread de Java no proporciona un medio para lograr esto, así que surgió lo siguiente:

 public class FlexiThread extends Thread{ //The Runnable impl to be executed private Runnable mvRunner; //Construct an empty subclass of Thread public FlexiThread(){ super(); } //Construct a subclass of Thread which provides //its Runnable impl immediately public FlexiThread(Runnable r){ super(r); mvRunner = r; } /** * * @return -- the Runnable implementation whose * run() method will be invoked when this thread * is started */ public Runnable getRunnableToExecute(){ return mvRunner; } /** * @param runner -- the Runnable implementation whose * run() method will be invoked when this thread * is started */ public void setRunnableToExecute(Runnable runner){ mvRunner = runner; } @Override public void run(){ mvRunner.run(); } } 

He probado FlexiThread y parece que funciona como se espera (que ejecuta cualquier código que doy en Runnable impl 's ejecutar el método en un hilo de ejecución separado verificado a través de DDMS) al menos en Android ICS y JB; ¿hay algo malo / potencialmente peligroso / ineficaz con la estrategia FlexiThread dada anteriormente? Si es así, ¿cuál podría ser una mejor manera de definir una subclase de subprocesos Runnable después de su construcción?

Yo usaría un Ejecutor ya que esto es reutilizable y controlable.

 ExecutorService es = Executors.newSingleThreadedPool(); // set a runnable later. es.submit(new MyRunnable()); // give it another runnable when that finishes. es.submit(new MyRunnable2()); // don't need it any more es.shutdown(); 

hay algo malo / potencialmente peligroso / ineficaz con la estrategia FlexiThread dada anteriormente

Yo diría que no, está bien, aunque me parece peligroso construir un hilo que no se puede iniciar hasta más tarde. Ciertamente, debería agregar algunos buenos comentarios de código explicando lo que está pasando. También añadir algunos tiros con buenos mensajes cuando intenta iniciar el hilo si el mvRunner no se ha establecido.

Una mejora es no extender el subproceso pero crear un FlexiRunnable en FlexiRunnable lugar:

 public class FlexiRunnable implements Runnable { private Runnable delegate; private volatile boolean running = false; public void run() { running = true; if (delegate != null) { delegate.run(); } } public void setDelegate(Runnable delegate) { if (running) { throw new IllegateStateException("The thread is already running..."); } this.delegate = delegate; } } ... FlexiRunnable flexi = new FlexiRunnable(); Thread thread = new Thread(flexi); ... flexi.setDelegate(...); thread.start(); 
  • Android Thread.start () CalledFromWrongThreadException
  • ¿Algún consejo sobre cómo acelerar esto en Android?
  • Cómo crear un hilo en Android NDK?
  • Cómo setText de un hilo independiente en Android
  • Cómo suspender y reanudar los hilos en android?
  • Java - Android: Hilo que se llama (ejecutar) dos veces
  • Hacer un hilo que cancela una llamada de InputStream.read () si ha pasado el tiempo 'x'
  • Es posible detener un subproceso que se está conectando a URL con httpConnection.connect ()?
  • Android ht stime, utime?
  • Handler no entrega un mensaje o un Runnable al subproceso principal
  • Valor devuelto del hilo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.