0Pricing
Java Academy · Lección

Hilos de plataforma frente a hilos virtuales

Cuándo conviene usar cada uno

Hilos de plataforma frente a hilos virtuales es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Dos tipos de hilos

Java tiene ahora dos tipos de hilos. Los hilos de plataforma son los envoltorios clásicos de los hilos del sistema operativo. Los hilos virtuales son ligeros y los gestiona la JVM.

Saber cuándo elegir cada uno es fundamental para escribir código Java concurrente y escalable.

Crear un hilo de plataforma

Se crea un hilo de plataforma con Thread.ofPlatform(), el equivalente de Thread.ofVirtual().

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread p = Thread.ofPlatform().name("native-worker").start(() ->
            System.out.println("Platform? " + !Thread.currentThread().isVirtual()));
        p.join();
    }
}

Comparación de costes

Los hilos de plataforma son pesados:

  • Aproximadamente 1 MB de pila reservada por hilo
  • Son lentos de crear
  • Están limitados a unos pocos miles

Los hilos virtuales son económicos: tienen una pila inicial pequeña, se crean rápidamente y es viable usar millones de ellos.

Trabajo I/O-bound

Si su tarea pasa la mayor parte del tiempo esperando a la red, al disco o a una base de datos, los hilos virtuales ofrecen una gran ventaja.

Mientras un hilo virtual está bloqueado, su hilo portador queda libre para ejecutar otros, por lo que unos pocos hilos del sistema operativo pueden atender miles de solicitudes.

Trabajo CPU-bound

Para cálculos puros que nunca se bloquean, los hilos virtuales no ofrecen ninguna mejora de velocidad. Está limitado por el número de núcleos.

En este caso, un pool fijo dimensionado según los procesadores es la herramienta adecuada.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int cores = Runtime.getRuntime().availableProcessors();
        try (ExecutorService cpu = Executors.newFixedThreadPool(cores)) {
            Future<Long> f = cpu.submit(() -> {
                long s = 0;
                for (long i = 0; i < 1_000_000L; i++) s += i;
                return s;
            });
            System.out.println("Cores: " + cores + ", sum: " + f.get());
        }
    }
}

Simular bloqueos

Este fragmento muestra muchos hilos virtuales durmiendo simultáneamente, como sustituto de una E/S bloqueante. Intente imaginar a 10.000 hilos de plataforma haciendo lo mismo.

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        AtomicInteger done = new AtomicInteger();
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 10_000; i++) {
                exec.submit(() -> {
                    try { Thread.sleep(50); } catch (InterruptedException e) {}
                    done.incrementAndGet();
                });
            }
        }
        System.out.println("Finished blocking tasks: " + done.get());
    }
}

Estado daemon

Los hilos virtuales siempre son hilos daemon y no pueden convertirse en hilos que no sean daemon. De forma predeterminada, los hilos de plataforma heredan el estado daemon de quien los crea, pero este estado se puede establecer explícitamente.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        Thread p = Thread.ofPlatform().unstarted(() -> {});
        System.out.println("virtual daemon: " + v.isDaemon());
        System.out.println("platform daemon: " + p.isDaemon());
    }
}

Las prioridades se ignoran

Los hilos virtuales siempre informan de una prioridad NORM_PRIORITY, y establecer la prioridad no tiene ningún efecto. La JVM se encarga de la planificación, no el planificador del sistema operativo.

public class Main {
    public static void main(String[] args) {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        v.setPriority(Thread.MAX_PRIORITY);
        System.out.println("Priority is still: " + v.getPriority());
    }
}

Criterio para decidir

Una regla práctica:

  • ¿Muchas tareas que esperan a la E/S? Use hilos virtuales.
  • ¿Una computación intensa limitada por la CPU? Use un pool fijo de hilos de plataforma.
  • ¿Necesita ajustar los hilos a nivel del sistema operativo, como la prioridad o la afinidad? Use hilos de plataforma.

Pueden coexistir

No tiene que elegir uno solo para todo el programa. Una aplicación típica usa hilos virtuales para gestionar solicitudes y un pool pequeño de hilos de plataforma para las secciones con uso intensivo de la CPU.

Ambos comparten la misma API de Thread, por lo que combinarlos es sencillo.

Consejo para la migración

Al migrar un servicio con un uso intensivo de E/S, el cambio más pequeño consiste en sustituir el executor: reemplace un pool fijo o en caché por newVirtualThreadPerTaskExecutor().

Solo debe tener cuidado con el pinning y el uso excesivo de ThreadLocal, temas que se tratan en la siguiente lección.

Comprobación rápida

Elija la carga de trabajo en la que los hilos virtuales ofrecen el beneficio más claro.

Resumen

Ha comparado los dos modelos de hilos:

  • Hilos de plataforma: pesados, respaldados por el sistema operativo y adecuados para trabajos CPU-bound y ajustes del sistema operativo
  • Hilos virtuales: económicos, gestionados por la JVM, siempre daemon y adecuados para la concurrencia I/O-bound
  • Pueden coexistir y comparten la misma API

A continuación: los problemas del pinning y de ThreadLocal.

Preguntas frecuentes

¿La lección «Hilos de plataforma frente a hilos virtuales» es gratis?

Sí — el texto completo de «Hilos de plataforma frente a hilos virtuales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Hilos de plataforma frente a hilos virtuales»?

Cuándo conviene usar cada uno Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Hilos de plataforma frente a hilos virtuales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Qué son los hilos virtuales
  2. Creación de hilos virtuales
  3. Hilos de plataforma frente a hilos virtuales
  4. Errores: pinning y ThreadLocals
← Volver a Java Academy