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
- Hilo (Thread): Es una unidad de ejecución dentro de un proceso. Un proceso puede contener múltiples hilos que comparten los mismos recursos.
- Multithreading: Es la capacidad de un programa para gestionar múltiples hilos de ejecución al mismo tiempo.
- Runnable Interface: Una interfaz funcional que debe ser implementada por cualquier clase cuyas instancias están destinadas a ser ejecutadas por un hilo.
- 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:
- Implementando la interfaz Runnable
- Extendiendo la clase Thread
- 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:
MyRunnableimplementa la interfazRunnabley define el métodorun().- En el método
main, se crea una instancia deMyRunnabley se pasa al constructor deThread. - El método
start()se llama en el objetoThreadpara iniciar el hilo.
- 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:
MyThreadextiende la claseThready sobrescribe el métodorun().- En el método
main, se crea una instancia deMyThread. - El método
start()se llama en el objetoMyThreadpara 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:
- Implementa una clase
Taskque implemente la interfazRunnable. - En el método
run(), imprime los números del 1 al 5 con un retraso de 1 segundo entre cada número. - Crea un objeto
Thready pásale una instancia deTask. - 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:
- Crea una clase
Counterque extiendaThread. - En el método
run(), imprime los números del 1 al 5 con un retraso de 1 segundo entre cada número. - Crea una instancia de
Countery llama al métodostart().
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
- No Sobrescribir el Método
run(): Asegúrate de sobrescribir el métodorun()en la clase que implementaRunnableo extiendeThread. - Llamar a
run()en lugar destart(): Llamar arun()directamente no iniciará un nuevo hilo. Siempre usastart()para iniciar el hilo. - Manejo de Excepciones: Siempre maneja
InterruptedExceptioncuando usesThread.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
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection
