HOWTO · Java

Obtener Thread Id en Java

Este artículo repasa los métodos para obtener la identificación del hilo en Java.

En esta página

En Java, llama a Thread.getId() sobre un objeto Thread para leer su identificador. Mientras se ejecuta una tarea en un executor, Thread.currentThread().getId() identifica el hilo trabajador que la está ejecutando. Los ejemplos siguientes muestran ambos casos; ninguno de esos valores identifica un grupo de hilos ni el nombre de un hilo. Usa el primer método cuando ya tengas una referencia a Thread, y el segundo desde el código de una tarea cuando necesites identificar el hilo trabajador que la ejecuta.

Obtener el ID de un hilo en Java con Thread.getId()

Crea un objeto Thread y llama a su método getId() para obtener el identificador de ese objeto como un long. El primer ejemplo crea dos objetos de hilo y lee ambos ID. No inicia los hilos; no es necesario iniciarlos para leer los identificadores de esos objetos. El entorno de ejecución asigna los valores de los identificadores, que pueden variar entre ejecuciones o entornos. Por eso, usa el valor obtenido durante la ejecución en lugar de confiar en los números de muestra. Este método resulta útil cuando el código tiene una referencia a un Thread concreto y necesita distinguir ese objeto de otro.

public class GetThreadID {
  public static void main(String[] args) {
    Thread thread1 = new Thread();
    Thread thread2 = new Thread();

    System.out.println("Thread 1 ID: " + thread1.getId());
    System.out.println("Thread 2 ID: " + thread2.getId());
  }
}

Salida ilustrativa de una ejecución:

Thread 1 ID: 12
Thread 2 ID: 13

Los ID numéricos anteriores son ilustrativos y dependen del entorno de ejecución. Como los hilos no se inician, el programa imprime los ID de los dos objetos en el orden de las instrucciones de impresión; los números de muestra no están garantizados en otra ejecución o entorno. Las etiquetas visibles dentro de los bloques de salida se mantienen en inglés porque esos bloques se conservan sin cambios.

Obtener el ID del hilo trabajador actual en un grupo de hilos con Thread.currentThread().getId()

Una tarea enviada a un executor se ejecuta en uno de sus hilos trabajadores. Llama a Thread.currentThread().getId() desde dentro de la tarea para obtener el ID del hilo trabajador que la está ejecutando en ese momento. Es el ID de un trabajador, no una identidad del executor ni del grupo de hilos. Un grupo fijo reutiliza sus hilos trabajadores, por lo que distintas tareas pueden mostrar el mismo ID de trabajador. La planificación determina qué trabajador atiende cada tarea; tanto el orden de las tareas como los ID numéricos pueden variar. Esta distinción es útil para diagnosticar qué hilo realizó una unidad de trabajo: el número devuelto describe al trabajador que la ejecutaba en ese momento, no al executor que la programó.

El ejemplo envía cinco tareas, imprime el número de cada tarea y el ID de su hilo trabajador, y después cierra el executor. shutdown() impide que acepte tareas nuevas y permite que terminen las ya enviadas. awaitTermination espera a que finalicen durante un máximo de un minuto, sin mantener el procesador ocupado en una espera activa. Si el trabajo tarda más, el programa informa que se agotó el tiempo de espera; la solicitud de cierre ya se ha enviado, así que las tareas en cola pueden continuar. En código de producción, elige un límite de tiempo adecuado para el trabajo de la aplicación y decide cómo responder si las tareas no terminan a tiempo. Si necesitas elegir detalles de la API para una versión concreta de Java, consulta la documentación de esa versión; aquí no se especifica ninguna versión de destino.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class GetThreadID {
  public static void main(String[] args) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(2);

    for (int i = 1; i <= 5; i++) {
      final int taskNumber = i;
      executor.execute(() -> {
        long workerId = Thread.currentThread().getId();
        System.out.println("Task " + taskNumber + " ran on worker ID " + workerId);
      });
    }

    executor.shutdown();
    boolean finished = executor.awaitTermination(1, TimeUnit.MINUTES);
    System.out.println(finished ? "All tasks finished" : "Wait timed out");
  }
}

Salida ilustrativa de una ejecución; el orden de las tareas y los ID numéricos dependen del entorno de ejecución:

Task 2 ran on worker ID 13
Task 3 ran on worker ID 13
Task 4 ran on worker ID 13
Task 5 ran on worker ID 13
Task 1 ran on worker ID 12
All tasks finished

Coloca la llamada dentro de la tarea cuando quieras identificar el hilo trabajador que la ejecuta. Si la llamas en otro lugar, obtendrás el ID del hilo que esté ejecutando ese otro código. Como un grupo puede reutilizar trabajadores y planificar las tareas de distintas maneras, usa la salida para entender una ejecución concreta, no como una correspondencia fija entre los números de tarea y los ID de los trabajadores. Las etiquetas visibles dentro de los bloques de salida se mantienen en inglés porque esos bloques se conservan sin cambios.