Hoy veremos cómo usar Thread y Runnable en Java para ejecutar código cada N milisegundos en un hilo separado del principal.
Crearemos un Runnable
y lo vamos a ejecutar en un nuevo hilo creado con Thread
, de esa manera podremos imprimir un mensaje cada segundo para demostrar el uso, aunque en la vida real podría servir para otras cosas.
Personalmente utilicé esto para refrescar un reloj en una interfaz creada con Swing.
Un poco de historia
Estaba en mi trabajo y tenía que entregar un proyecto, ya todo estaba terminado excepto una cosa: un reloj que iba en la interfaz (era algo de un checador de horarios).
Si estuviera en JavaScript, habría usado al buen amigo setInterval, pero no, esto es Java. Así que investigando un poco encontré que la combinación de Runnable y Thread en Java pueden ser un equivalente a setInterval de JavaScript.
Nota
Sé que este no es el lugar, pero nunca es malo decirlo: Java y JavaScript no son lo mismo, solamente estoy mencionando alternativas, ya que lo único que tienen en común es que ambos son lenguajes de programación.
Runnable y Thread en Java
Bueno, ahora sí a lo que venimos. Ya lo dije hace un momento, para demostrar el uso de esto vamos a imprimir un mensaje en la consola cada segundo.
De esa manera vamos a ejecutar código cada cierto tiempo sin interrumpir el hilo principal de la app.
Definir el Runnable
Definimos un nuevo objeto de tipo Runnable y sobrescribimos el método run. Dentro del método ponemos un ciclo while infinito (el cual detendría el hilo principal, pero como no es el principal, no pasará nada).
Ya dentro del ciclo dormimos o esperamos determinado tiempo y ejecutamos el código que será repetido. Por lo tanto queda así:
Runnable runnable = new Runnable() {
@Override
public void run() {
// Esto se ejecuta en segundo plano una única vez
while (true) {
// Pero usamos un truco y hacemos un ciclo infinito
try {
// En él, hacemos que el hilo duerma
Thread.sleep(1000);
// Y después realizamos las operaciones
System.out.println("Me imprimo cada segundo");
// Así, se da la impresión de que se ejecuta cada cierto tiempo
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
El método Thread.sleep
recibe el número de milisegundos que el hilo duerme. Como queremos que el código se repita cada segundo, dormimos mil milisegundos.
Thread.sleep
puede generar una excepción de tipo InterruptedException así que la manejamos con un try catch
. No está de más mencionar que también va a lanzar una de tipo IllegalArgumentException si el número de milisegundos es negativo.
Más información en la documentación oficial.
Ejecutar Runnable con Thread
Una vez que ya definimos el Runnable, lo ejecutamos en un nuevo hilo. El siguiente código lo demuestra:
// Creamos un hilo y le pasamos el runnable
Thread hilo = new Thread(runnable);
hilo.start();
Gracias a esto podríamos crear más hilos y todo eso.
Ejemplo de Runnable y Thread en Java
Ahora pongamos todo junto y veamos un ejemplo en donde se ejecuta el código de manera repetitiva cada cierto tiempo. La clase Main queda así:
/*
Ejemplo con Runnable y Thread para ejecutar código cada cierto
tiempo en Java
@author parzibyte.me
*/
class Main {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
// Esto se ejecuta en segundo plano una única vez
while (true) {
// Pero usamos un truco y hacemos un ciclo infinito
try {
// En él, hacemos que el hilo duerma
Thread.sleep(1000);
// Y después realizamos las operaciones
System.out.println("Me imprimo cada segundo");
// Así, se da la impresión de que se ejecuta cada cierto tiempo
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
// Creamos un hilo y le pasamos el runnable
Thread hilo = new Thread(runnable);
hilo.start();
// Y aquí podemos hacer cualquier cosa, en el hilo principal del programa
System.out.println("Yo imprimo en el hilo principal");
}
}
En el hilo principal realizamos las operaciones comunes mientras que en el que creamos se estará ejecutando de manera separada y paralela.
Probar ejemplo
Eres libre de descargar el código. Recuerda instalar Java y luego NetBeans.
Con eso terminamos por hoy. Te invito a leer más sobre Java.
Excelente código, sencillo pero muy funcional, lo implemente en sockets y quedó fantástico, gracias maestro.
Pingback: Java y swing: mostrar y refrescar reloj con hora actual - Parzibyte's blog