HOWTO · Java
Obter Thread Id em Java
Este artigo passa pelos métodos para obter a identificação do string em Java.
Nesta página
Em Java, chame Thread.getId() num objeto Thread para obter o identificador dessa thread. Enquanto uma tarefa é executada por um executor, Thread.currentThread().getId() identifica a thread trabalhadora que a está a executar. Os exemplos abaixo mostram ambos os casos; nenhum dos valores identifica um pool de threads ou o nome de uma thread. Use a primeira abordagem quando já tiver uma referência a Thread e a segunda, dentro do código de uma tarefa, quando precisar de identificar a thread trabalhadora que a executa.
Obter o ID de uma thread em Java com Thread.getId()
Crie um objeto Thread e chame o método getId() para obter o identificador desse objeto como um valor long. O primeiro exemplo cria dois objetos de thread e lê os respetivos IDs. As threads não são iniciadas; isso não é necessário para ler os identificadores destes objetos. Os valores são atribuídos pelo ambiente de execução e podem variar entre execuções ou ambientes. Por isso, use o valor devolvido durante a execução, em vez de depender dos números de exemplo. Esta abordagem é útil quando o código tem uma referência a uma Thread específica e precisa de a distinguir de outra.
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());
}
}
Saída ilustrativa de uma execução:
A saída abaixo mostra os IDs dos dois objetos. O rótulo apresentado no bloco permanece em inglês, pois o bloco foi preservado sem alterações.
Thread 1 ID: 12
Thread 2 ID: 13
Os IDs numéricos acima são ilustrativos e dependem do ambiente de execução. Como as threads não são iniciadas, o programa apresenta os IDs dos dois objetos pela ordem das instruções de impressão. Os números do exemplo não são garantidos noutra execução ou ambiente.
Obter o ID da thread trabalhadora atual num pool de threads com Thread.currentThread().getId()
Uma tarefa submetida a um executor é executada por uma das suas threads trabalhadoras. Chame Thread.currentThread().getId() dentro da tarefa para obter o ID da thread que a está a executar. Esse é o ID de uma thread trabalhadora, não uma identidade do executor ou do pool. Um pool fixo reutiliza as suas threads, pelo que tarefas diferentes podem apresentar o mesmo ID. O escalonamento determina qual thread trata cada tarefa, e tanto a ordem das tarefas como os IDs numéricos podem variar. Esta distinção é útil para diagnosticar qual thread realizou uma unidade de trabalho: o número devolvido descreve a thread que a executa naquele momento, e não o executor que a agendou.
O exemplo submete cinco tarefas, apresenta o número de cada tarefa e o ID da thread que a executa e, em seguida, encerra o executor. shutdown() impede a aceitação de novas tarefas, permitindo que as já submetidas terminem. awaitTermination aguarda a conclusão durante, no máximo, um minuto, sem espera ativa. Se o trabalho demorar mais, o programa informa que o tempo de espera expirou; o pedido de encerramento já foi feito, pelo que as tarefas em fila podem continuar. Em código de produção, escolha um tempo limite adequado ao trabalho da aplicação e defina como reagir se as tarefas não terminarem a tempo. Se precisar de escolher detalhes da API para uma versão específica de Java, consulte a documentação dessa versão; aqui não foi especificada uma versão-alvo.
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");
}
}
Saída ilustrativa de uma execução; a ordem das tarefas e os IDs numéricos dependem do ambiente de execução:
A saída abaixo mostra os números das tarefas e os IDs das threads trabalhadoras. Os rótulos apresentados no bloco permanecem em inglês, pois o bloco foi preservado sem alterações.
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
Coloque a chamada dentro da tarefa quando quiser identificar a thread que a está a executar. Se a chamar noutro local, obterá a thread que executa esse outro código. Como um pool pode reutilizar threads e escalonar tarefas de formas diferentes, use a saída para compreender uma execução específica, não como uma correspondência fixa entre números de tarefas e IDs de threads trabalhadoras.