Explorando el código, creando soluciones, y compartiendo conocimientos en el fascinante mundo del desarrollo de software.

martes, 13 de febrero de 2024

Hilos y Concurrencia en Java: Creación, Manejo y Sincronización

Hilos y Concurrencia en Java: Creación, Manejo y Sincronización

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.


Navegación entre lecciones



© 2024 Programar desde Cero


No hay comentarios:

Publicar un comentario

Java Iniciación en Java Hola mundo en Java Sintaxis básica de Java Orientación a objetos en Java Manejo de excepciones en Java Java desde Cero Colecciones en Java Manejo de Archivos en Java Entrada/Salida en Java Hilos y concurrencia en Java Programación Funcional en Java Programación Orientada a Objetos (OOP) en Java Manejo de fechas y tiempos Persistencia de datos en Java Desarrollo Web en Java Manejo de dependencias Gradle Maven JUnit Git Java Desarrollo de servicios web en Java Patrones de Diseño en Java Principios Básicos de Seguridad en Java Principios SOLID en Java Frameworks populares en Java Ciclo de vida de una aplicación Java Desarrollo Ágil Base de Datos en Java Hola mundo en COBOL Estructura básica de COBOL Sintaxis Básica de COBOL Manipulación de archivos en COBOL Búsqueda en Archivos Secuenciales COBOL Ordenación y Combinación de Archivos COBOL Manejo de Errores en COBOL Subprogramas y Modularidad en COBOL Archivos Indexados en COBOL Clasificación y Fusión de Archivos en COBOL Lectura y Escritura de Archivos Secuenciales COBOL IDE Desarrollo de Software Programación Java Plugin Eclipse Desarrollo Integrado Eclipse IDE Java Development Desarrollo de Aplicaciones Programación en Eclipse Desarrollo Ágil Java EE Desarrollo Web Desarrollo Móvil Eclipse Marketplace Eclipse Plugins JavaFX Desarrollo GUI Git Control de Versiones GitHub Git Bash Git Commands Git Workflow Branching Merging Repositorios Commit Git Branch Git Pull Git Push Git Clone Git Merge Conflictos en Git Git Log Git Tag Git Remote Visual Studio Code IDE Desarrollo de Software Extensiones Editor de Código Programación Configuración VSC Snippets Depuración Control de Versiones Integración Git Atajos de Teclado Temas Productividad Extensiones VSC Lenguajes de Programación