Clase Java Thread

La clase Thread es la clase principal en Java para crear y gestionar hilos.

En Java, cada hilo es una instancia de la clase Thread. Un hilo puede entenderse como una "subtarea" que se ejecuta de forma independiente en el programa, lo que permite que el programa realice múltiples operaciones simultáneamente.

En Java, hay dos formas de crear hilos:

  1. Heredar de la clase Thread
  2. Implementar la interfaz Runnable

Uso básico de la clase Thread

Crear hilos

Ejemplo

// Método 1: heredar la clase Thread
class MyThread extends Thread {
    public void run() {
        System.out.println("El hilo se está ejecutando");
    }
}

// Método 2: implementar la interfaz Runnable
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("El hilo se está ejecutando");
    }
}

public class Main {
    public static void main(String[] args) {
        // Usando la herencia
        MyThread thread1 = new MyThread();
        thread1.start();
       
        // Usando la interfaz
        Thread thread2 = new Thread(new MyRunnable());
        thread2.start();
    }
}

Ciclo de vida de los hilos

Los hilos de Java tienen los siguientes estados:

  • NEW: Hilo recién creado, aún no se ha llamado al método start()
  • RUNNABLE: Estado ejecutable, puede estar en ejecución o esperando tiempo de CPU
  • BLOCKED: Hilo bloqueado, esperando obtener el bloqueo del monitor
  • WAITING: Estado de espera, esperando que otros hilos realicen operaciones específicas
  • TIMED_WAITING: Estado de espera con tiempo limitado
  • TERMINATED: Hilo terminado

Métodos comunes de la clase Thread

Métodos de control básicos

Ejemplo

Thread thread = new Thread(() -> {
    System.out.println("Hilo en ejecución");
});

thread.start();  // Iniciar el hilo
thread.join();   // Esperar a que termine el hilo
thread.sleep(1000); // El hilo duerme 1 segundo

Prioridad de hilos

Ejemplo

thread.setPriority(Thread.MAX_PRIORITY);  // Prioridad máxima (10)
thread.setPriority(Thread.NORM_PRIORITY); // Prioridad por defecto (5)
thread.setPriority(Thread.MIN_PRIORITY);  // Prioridad mínima (1)

Interrupción de hilos

Ejemplo

thread.interrupt(); // Interrumpir el hilo

// Comprobar el estado de interrupción en el hilo
if (Thread.interrupted()) {
    // Manejar la lógica de interrupción
}

Sincronización de hilos

Cuando varios hilos acceden a recursos compartidos, se necesita un mecanismo de sincronización para evitar problemas de inconsistencia de datos.

Usar la palabra clave synchronized

Ejemplo

class Counter {
    private int count = 0;
   
    public synchronized void increment() {
        count++;
    }
}

Usar la interfaz Lock

Ejemplo

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
   
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

Pool de hilos y la clase Thread

En el desarrollo real, normalmente se utiliza un pool de hilos para gestionarlos, en lugar de crear objetos Thread directamente.

Ejemplo

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
       
        for (int i = 0; i < 10; i++) {
            executor.execute(() -> {
                System.out.println("El hilo ejecuta la tarea");
            });
        }
       
        executor.shutdown();
    }
}

Mejores prácticas

  1. Priorizar la creación de hilos implementando la interfaz Runnable
  2. Usar un pool de hilos para gestionar los recursos de los hilos
  3. Evitar la sincronización excesiva; usar mecanismos de sincronización solo cuando sea necesario
  4. Usar la palabra clave volatile para garantizar la visibilidad de las variables
  5. Considerar el uso de las clases de herramientas avanzadas del paquete de concurrencia de Java (java.util.concurrent)

Mediante el uso adecuado de la clase Thread y las herramientas de concurrencia relacionadas, se pueden escribir programas Java multiproceso eficientes y fiables.

Otras extensiones