Eu tenho um pool de threads fixo ao qual eu envio tarefas (limitado a 5 threads). Como posso descobrir qual desses 5 threads executa minha tarefa (algo como "o thread 3 de 5 está executando esta tarefa")?
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
//in infinite loop:
taskExecutor.execute(new MyTask());
....
private class MyTask implements Runnable {
public void run() {
logger.debug("Thread # XXX is doing this task");//how to get thread id?
}
}
% numThreads
em vezgetId()
é14291
onde asgetName()
dápool-29-thread-7
, o que eu diria que é mais útil.A resposta aceita responde à pergunta sobre como obter um ID de thread, mas não permite que você faça mensagens "Thread X of Y". Os IDs de encadeamento são únicos nos encadeamentos, mas não necessariamente iniciam de 0 ou 1.
Aqui está um exemplo que corresponde à pergunta:
e a saída:
Um pequeno ajuste usando a aritmética do módulo permitirá que você faça o "encadeamento X de Y" corretamente:
Novos resultados:
fonte
Você pode usar Thread.getCurrentThread.getId (), mas por que você faria isso quando os objetos LogRecord gerenciados pelo criador de logs já possuem o ID do encadeamento? Eu acho que você está perdendo uma configuração em algum lugar que registra os IDs de segmento para suas mensagens de log.
fonte
Se sua classe herdar do Thread , você poderá usar métodos
getName
esetName
nomear cada thread. Caso contrário, você pode adicionar umname
campoMyTask
e inicializá-lo no seu construtor.fonte
Se você estiver usando o log, os nomes dos threads serão úteis. Uma fábrica de threads ajuda com isso:
Resultado:
fonte
Existe a maneira de obter o thread atual:
Depois de obter o objeto da classe Thread (t), você poderá obter as informações necessárias usando os métodos da classe Thread.
Identificação da thread gettting:
Nome do tópico gettting:
fonte