java

Java – Ejecutar código de manera repetitiva cada cierto tiempo con Runnable y Thread

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.

Runnable y Thread en Java – Ejecutar código cada cierto tiempo

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Excelente código, sencillo pero muy funcional, lo implemente en sockets y quedó fantástico, gracias maestro.

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.