A veces no es conveniente extender la clase Thread porque se pierde la posibilidad de extender otro objeto. Es una de las razones por que existe la interfaz Runnable que declara nada más que el método public void run() y que se puede usar fácilmente para crear hilos trabajadores.
class RunPingPONG implements Runnable {
private String word;
private int delay;
RunPingPONG(String whatToSay, int delayTime) {
word =whatToSay;
delay=delayTime;
}
public void run() {
try {
for(;;) {
System.out.print(word+" ");
Thread.sleep(delay);
}
}
catch(InterruptedException e) {
return;
}
}
public static void main(String[] args) {
Runnable ping = new RunPingPONG("ping", 40);
Runnable PONG = new RunPingPONG("PONG", 50);
new Thread(ping).start();
new Thread(PONG).start();
}
}
Existen cuatro constructores para crear hilos usando la interfaz Runnable.
La interfaz Runnable exige solamente el método run(), sin embargo, normalmente se implementa más métodos para crear un servicio complete que este hilo debe cumplir.
Aún no hemos guardado las referencias de los hilos en unas variables, los hilos no caen en las manos del recolector de memoria: siempre se mantiene una referencia al hilo en su grupo al cual pertenece.
El método run() es público y en muchos casos implementando algún tipo de servicio no se quiere dar permiso a otros ejecutar directamente el método run(). Para evitar eso se puede recurrir a la siguiente construcción:
class Service {
private Queue requests = new Queue();
public Service() {
Runnable service = new Runnable() {
public void run() {
for(;;) realService((Job)requests.take());
}
};
new Thread(service).start();
}
public void AddJob(Job job) {
requests.add(job);
}
private void realService(Job job) {
// do the real work
}
}
Crear el servicio con Service() lanza un nuevo hilo que actua sobre una cola para realizar su trabajo con cada tarea que encuentra ahí. El trabajo por hacer se encuentra en el método privado realService(). Una nueva tarea se puede añadir a la cola con AddJob(...).
Nota: la construcción arriba usa el concepto de clases anónimos de Java, es decir, sabiendo que no se va a usar la clase en otro sitio menos en su punto de construcción, se declara directamente donde se usa.