====== 03 - Threads en Java ======
===== Threads =====
Un thread (hilo) es una línea independiente de ejecución dentro de un programa. Un programa Java siempre tiene al menos un hilo: el hilo principal, donde empieza main(). Podemos crear más hilos para que el programa haga varias cosas “a la vez” (concurrencia).
Por ejemplo, un servidor que atiende a varios clientes en paralelo crea un hilo por cada conexión para que no se bloqueen entre sí.
===== Formas de crear un hilo =====
** Implementando la interfaz [[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Runnable.html|Runnable]] **
package es.cesguiro.threads;
public class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("Task started by " + Thread.currentThread().getName());
}
}
** Usando una clase Anónima**
package es.cesguiro.threads;
public class AnonymousThread {
public Runnable startThread() {
return new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Task started by " + Thread.currentThread().getName());
}
});
}
}
** Con expresiones lambda (Java 8+)**
package es.cesguiro.threads;
public class LambdaThread {
public Runnable startThread() {
return () -> System.out.println("Task started by " + Thread.currentThread().getName());
}
}
===== Ejecutando varios hilos =====
package es.cesguiro.threads;
public class Main {
public static void main(String[] args) {
Thread thread1 = new Thread(new RunnableThread(), "RunnableThread");
Thread thread2 = new Thread(new AnonymousThread().startThread(), "AnonymousThread");
Thread thread3 = new Thread(new LambdaThread().startThread(), "LambdaThread");
thread1.start();
thread2.start();
thread3.start();
Runnable loopTask = () -> {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
try {
Thread.sleep(1000); // Sleep for 1 second
} catch (InterruptedException e) {
System.err.println("Thread interrupted: " + e.getMessage());
}
}
};
Thread thread4 = new Thread(loopTask, "LoopThread-1");
Thread thread5 = new Thread(loopTask, "LoopThread-2");
thread4.start();
thread5.start();
}
}
===== Métodos importantes =====
* **start()** → Arranca el hilo (no llamar a run() directamente).\\ \\
* **run()** → Código que ejecutará el hilo.\\ \\
* **sleep(ms)** → Pausa el hilo actual.\\ \\
* **join()** → Espera a que otro hilo termine.\\ \\
===== Notas importantes =====
**Los hilos comparten memoria** → cuidado con las variables compartidas (condiciones de carrera).
**Demasiados hilos pueden saturar CPU/memoria** (más adelante veremos thread pools).