En este tema, aprenderemos cómo crear y gestionar hilos en Java. Los hilos permiten ejecutar múltiples tareas simultáneamente dentro de un programa, lo que puede mejorar significativamente el rendimiento y la capacidad de respuesta de las aplicaciones.

Conceptos Clave

  1. Hilo (Thread): Es una unidad de ejecución dentro de un proceso. Un proceso puede contener múltiples hilos que comparten los mismos recursos.
  2. Multithreading: Es la capacidad de un programa para gestionar múltiples hilos de ejecución al mismo tiempo.
  3. Runnable Interface: Una interfaz funcional que debe ser implementada por cualquier clase cuyas instancias están destinadas a ser ejecutadas por un hilo.
  4. Thread Class: Una clase que proporciona los métodos y propiedades necesarios para crear y gestionar hilos.

Métodos para Crear Hilos

Existen dos formas principales de crear hilos en Java:

  1. Implementando la interfaz Runnable
  2. Extendiendo la clase Thread

  1. Implementando la Interfaz Runnable

La interfaz Runnable debe ser implementada por cualquier clase cuyas instancias están destinadas a ser ejecutadas por un hilo. La clase debe definir un método run() que contiene el código que se ejecutará en el hilo.

Ejemplo:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hilo ejecutado usando Runnable");
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start(); // Inicia el hilo
    }
}

Explicación:

  • MyRunnable implementa la interfaz Runnable y define el método run().
  • En el método main, se crea una instancia de MyRunnable y se pasa al constructor de Thread.
  • El método start() se llama en el objeto Thread para iniciar el hilo.

  1. Extendiendo la Clase Thread

Otra forma de crear un hilo es extendiendo la clase Thread y sobrescribiendo el método run().

Ejemplo:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Hilo ejecutado extendiendo Thread");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // Inicia el hilo
    }
}

Explicación:

  • MyThread extiende la clase Thread y sobrescribe el método run().
  • En el método main, se crea una instancia de MyThread.
  • El método start() se llama en el objeto MyThread para iniciar el hilo.

Comparación de Métodos

Método Ventajas Desventajas
Implementando Runnable - Permite heredar de otra clase.
- Mejor separación de lógica de negocio y control de hilos.
- Requiere más código para crear el hilo.
Extendiendo Thread - Más simple y directo para hilos simples. - No permite heredar de otra clase.
- Menos flexible para aplicaciones complejas.

Ejercicios Prácticos

Ejercicio 1: Crear un Hilo usando Runnable

Instrucciones:

  1. Implementa una clase Task que implemente la interfaz Runnable.
  2. En el método run(), imprime los números del 1 al 5 con un retraso de 1 segundo entre cada número.
  3. Crea un objeto Thread y pásale una instancia de Task.
  4. Inicia el hilo.

Solución:

class Task implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000); // Pausa de 1 segundo
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread = new Thread(task);
        thread.start();
    }
}

Ejercicio 2: Crear un Hilo extendiendo Thread

Instrucciones:

  1. Crea una clase Counter que extienda Thread.
  2. En el método run(), imprime los números del 1 al 5 con un retraso de 1 segundo entre cada número.
  3. Crea una instancia de Counter y llama al método start().

Solución:

class Counter extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000); // Pausa de 1 segundo
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        counter.start();
    }
}

Errores Comunes y Consejos

  1. No Sobrescribir el Método run(): Asegúrate de sobrescribir el método run() en la clase que implementa Runnable o extiende Thread.
  2. Llamar a run() en lugar de start(): Llamar a run() directamente no iniciará un nuevo hilo. Siempre usa start() para iniciar el hilo.
  3. Manejo de Excepciones: Siempre maneja InterruptedException cuando uses Thread.sleep().

Conclusión

En esta sección, hemos aprendido cómo crear hilos en Java utilizando dos métodos: implementando la interfaz Runnable y extendiendo la clase Thread. También hemos visto ejemplos prácticos y ejercicios para reforzar los conceptos. En la siguiente sección, exploraremos el ciclo de vida de un hilo y cómo gestionar su estado.

Curso de Programación en Java

Módulo 1: Introducción a Java

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados