J'ai un pool de threads fixe auquel je soumets des tâches (limité à 5 threads). Comment puis-je savoir lequel de ces 5 threads exécute ma tâche (quelque chose comme "thread n ° 3 sur 5 fait cette tâche")?
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
placegetId()
est14291
où commegetName()
vous le donnepool-29-thread-7
, ce qui, à mon avis, est plus utile.La réponse acceptée répond à la question sur l'obtention d' un identifiant de thread, mais elle ne vous permet pas de faire des messages "Thread X of Y". Les identifiants de threads sont uniques entre les threads mais ne commencent pas nécessairement par 0 ou 1.
Voici un exemple correspondant à la question:
et la sortie:
Un léger ajustement en utilisant l'arithmétique modulo vous permettra de faire correctement "thread X of Y":
Nouveaux résultats:
la source
Vous pouvez utiliser Thread.getCurrentThread.getId (), mais pourquoi voudriez-vous faire cela alors que les objets LogRecord gérés par le logger ont déjà l'ID de thread. Je pense qu'il vous manque une configuration quelque part qui enregistre les ID de thread pour vos messages de journal.
la source
Si votre classe hérite de Thread , vous pouvez utiliser des méthodes
getName
etsetName
nommer chaque thread. Sinon, vous pouvez simplement ajouter unname
champ àMyTask
et l'initialiser dans votre constructeur.la source
Si vous utilisez la journalisation, les noms de threads seront utiles. Une fabrique de fil vous aide à cela:
Production:
la source
Il existe un moyen pour le thread actuel d'obtenir:
Une fois que vous avez obtenu l'objet de classe Thread (t), vous pouvez obtenir les informations dont vous avez besoin en utilisant les méthodes de classe Thread.
Obtention de l'ID de fil:
Obtention du nom du fil:
la source