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:
-
Extender el subproceso y anular ejecutar ()
- Simple Thread Management - Java - Android
- Android AsyncTask permanece en estado de ejecución después de completar
- OnSaveInstanceState / onPause - espera hasta que el estado se salve por completo antes de permitir que se procese el proceso
- Cuando ejecuto el subproceso segundo tiempo: java.lang.IllegalThreadStateException: El hilo ya comenzó
- Obtener las sugerencias de AutoCompleteTextView del servicio en un hilo independiente
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();
-
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?
- ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
- Android Webview loadUrl no funciona cuando viene de un hilo de trabajo
- ¿Cuál es la causa de los picos de rendimiento periódicos que se ven al hacer el procesamiento de matriz de computación caro en el Nexus 4?
- Enhebrado en Android
- Android gestión de hilos onPause
- Cuando está fuera del hilo principal, ¿cómo puedo obtener algún código para ejecutarse en el hilo principal lo más rápido posible?
- ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
- ¿Cómo ejecutar la solicitud web en su propio hilo?
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();
- obtener el color de fondo de textview sin utilizar ColorDrawable (API 11)
- Android: convierte textView en una salida de registro