2010-03-02 18 views

Respuesta

0

ejecutable, porque no se está agregando el comportamiento especializado para la clase Thread - que son simplemente marcando su lógica como ser capaz de ser ejecutado como su propio hilo.

9

Debe convertirlo en Runnable, y luego agregarlo a cualquiera de las clases de grupo de subprocesos existentes. Está encapsulando su unidad de trabajo en la nueva clase y luego usando el hilo para ejecutarlo.

Solo ampliaría Thread si estuviera haciendo algo con la clase de subprocesos en sí, como ampliarla con nuevas funciones. Dudo que sea el caso.

Una alternativa sería crear una nueva clase que fuera una composición de hilo y su lógica personalizada, p. tiene un Thread dentro y su propio método 'execute()' donde programa el hilo y lo agrega como un elemento de trabajo, completamente oculto desde el exterior ... Pero en ese caso estarías haciendo tu clase Runnable de todos modos, simplemente proporcionando un método de conveniencia para facilitar la adición a un hilo.

1

Ejecución instantánea Runnable ofrece una separación más clara entre su código y la implementación de subprocesos. La interfaz de Runnable simplemente indica que puede ejecutar este código en un hilo diferente.

Además, dado que puede implementar muchas interfaces pero extender solo una clase, solo puede proporcionar su propia superclase si implementa Runnable. Si extiende Thread, no puede tener ninguna otra superclase.

La única advertencia con Runnable es que necesita dos objetos, una instancia de Thread para ejecutar el código y otra de Runnable para proporcionar el código.

2

Si amplía Thread, siempre tiene que llamar a .start(), que inicia un thread NUEVO y ejecuta la tarea.

Si lo hace Runnable, también puede hacer un nuevo Thread (ejecutable) .start(), pero no se limita a eso. Usted puede reciclar hilos, con el consiguiente ahorro de algunos recursos como esto:

ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor(); 
service.execute(runnable); 
service.execute(someOtherTask); 

Deja un montón de sus runnables en una lista primero y luego ejecutarlos cuando sientes que la ejecución de ellos:

List<Runnable> todoList = new ArrayList<Runnable>(); 
Runnable fetchPaper = new Runnable("paper"); 
todoList.add(fetchPaper); 
Runnable fetchMilk = new Runnable("milk"); 
todoList.add(fetchMilk); 

//do something else or even return todoList... 
ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor(); 
for(Runnable task : todoList){ 
    recycleSingleThread.execute(task); 
} 

O puede incluso hacer

runnable.run(); 

dentro de su propio hilo.

Tal vez incluso podría guardar un ejecutable, quitar la serialización y ejecutarlo.
Toda esta flexibilidad no estará presente si amplía Thread.

Cuestiones relacionadas