Hilos y Concurrencia en Java
Creación y Manejo de Hilos
Java permite la ejecución simultánea de tareas mediante hilos. Aquí hay un ejemplo básico de creación y manejo de hilos:
class MiHilo extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getId() + " - Contador: " + i);
}
}
}
public class ManejoHilos {
public static void main(String[] args) {
// Creación de dos hilos
MiHilo hilo1 = new MiHilo();
MiHilo hilo2 = new MiHilo();
// Inicio de los hilos
hilo1.start();
hilo2.start();
}
}
En este ejemplo, la clase MiHilo
extiende la clase Thread
y sobrescribe el método run()
. Se crean dos instancias de esta clase, se inician y ejecutan en paralelo.
Sincronización
La sincronización es importante para evitar problemas de concurrencia, como condiciones de carrera. Aquí hay un ejemplo simple de sincronización:
class Contador {
private int valor = 0;
// Método sincronizado
public synchronized void incrementar() {
valor++;
}
public int obtenerValor() {
return valor;
}
}
public class SincronizacionHilos {
public static void main(String[] args) {
Contador contador = new Contador();
// Creación de dos hilos que incrementan el contador
Thread hilo1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
contador.incrementar();
}
});
Thread hilo2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
contador.incrementar();
}
});
// Inicio de los hilos
hilo1.start();
hilo2.start();
// Espera a que ambos hilos terminen
try {
hilo1.join();
hilo2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// Muestra el valor final del contador
System.out.println("Valor final del contador: " + contador.obtenerValor());
}
}
En este ejemplo, la clase Contador
tiene un método incrementar()
sincronizado para evitar que dos hilos modifiquen el valor al mismo tiempo.
Clases en el paquete java.util.concurrent
Java proporciona clases en el paquete java.util.concurrent
para facilitar la programación concurrente. Un ejemplo es el uso de ExecutorService
:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConcurrenteExecutor {
public static void main(String[] args) {
// Creación de un ExecutorService con un pool de hilos fijo
ExecutorService executor = Executors.newFixedThreadPool(2);
// Ejecución de tareas con el ExecutorService
for (int i = 1; i <= 5; i++) {
Runnable tarea = new MiTarea(i);
executor.execute(tarea);
}
// Apagado del ExecutorService después de completar las tareas
executor.shutdown();
}
}
class MiTarea implements Runnable {
private int numero;
public MiTarea(int numero) {
this.numero = numero;
}
public void run() {
System.out.println(Thread.currentThread().getId() + " - Tarea: " + numero);
}
}
En este ejemplo, se utiliza un ExecutorService
para ejecutar tareas de forma concurrente. Se crea un pool de hilos fijo y se ejecutan tareas implementadas por la clase MiTarea
.
No hay comentarios:
Publicar un comentario