Creación de threads implementando la interface Runnable

Esta segunda forma también requiere que se defina el método run(), pero además es necesario crear un objeto de la clase Thread para lanzar la ejecución del nuevo hilo. Al constructor de la clase Thread hay que pasarle una referencia del objeto de la clase que implementa la interface Runnable.

Posteriormente, cuando se ejecute el método start() del thread, éste llamará al método run() definido en la nueva clase. A continuación se muestra el mismo estilo de clase que en el ejemplo anterior implementada mediante la interface Runnable:

public class SimpleRunnable implements Runnable {
// se crea un nombre String nameThread;
// constructor

public SimpleRunnable (String str) { nameThread = str;
}
// definición del método run() public void run() {
for(int i=0;i<10;i++)
System.out.println(«Este es el thread: » + nameThread);
}
}

El siguiente código crea un nuevo thread y lo ejecuta por este segundo procedimiento:

SimpleRunnable p = new SimpleRunnable(«Hilo de prueba»);
// se crea un objeto de la clase Thread pasándolo el objeto Runnable como argumento Thread miThread = new Thread(p);
// se arranca el objeto de la clase Thread
miThread.start();

Este segundo método cobra especial interés con las applets, ya que cualquier applet debe heredar de la clase java.applet.Applet, y por lo tanto ya no puede heredar de Thread. Véase el siguiente ejemplo:

class ThreadRunnable extends Applet implements Runnable { private Thread runner=null;
// se redefine el método start() de Applet public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start(); // se llama al método start() de Thread
}
}
// se redefine el método stop() de Applet public void stop(){
runner = null; // se libera el objeto runner
}
}

En este ejemplo, el argumento this del constructor de Thread hace referencia al objeto Runnable cuyo método run() debería ser llamado cuando el hilo ejecutado es un objeto de ThreadRunnable.

La elección de una u otra forma -derivar de Thread o implementar Runnable- depende del tipo de clase que se vaya a crear. Así, si la clase a utilizar ya hereda de otra clase (por ejemplo un applet, que siempre hereda de Applet), no quedará más remedio que implementar Runnable, aunque normalmente es más sencillo heredar de Thread.

Fuente: Aprenda Java como si estuviera en primero de la Universidad de Navarra