146 votes

Java: Comment obtenir un identifiant de thread à partir d'un pool de threads?

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 (par exemple, "le thread n ° 3 sur 5 effectue 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?
    }
}
 

254voto

skaffman Points 197885

Utilisation de Thread.currentThread() :

 private class MyTask implements Runnable {
    public void run() {
        long threadId = Thread.currentThread().getId();
        logger.debug("Thread # " + threadId + " is doing this task");
    }
}
 

26voto

Burhan Ali Points 1243

L'on a accepté la réponse répond à la question sur l'obtention d' un id de thread, mais il n'est pas "Thread X de Y" des messages. Thread id sont uniques à travers les threads, mais ne sont pas nécessairement commencer par 0 ou 1.

Voici un exemple correspondant à la question:

import java.util.concurrent.*;
class ThreadIdTest {

  public static void main(String[] args) {

    final int numThreads = 5;
    ExecutorService exec = Executors.newFixedThreadPool(numThreads);

    for (int i=0; i<10; i++) {
      exec.execute(new Runnable() {
        public void run() {
          long threadId = Thread.currentThread().getId();
          System.out.println("I am thread " + threadId + " of " + numThreads);
        }
      });
    }

    exec.shutdown();
  }
}

et la sortie:

burhan@orion:/dev/shm$ javac ThreadIdTest.java && java ThreadIdTest
I am thread 8 of 5
I am thread 9 of 5
I am thread 10 of 5
I am thread 8 of 5
I am thread 9 of 5
I am thread 11 of 5
I am thread 8 of 5
I am thread 9 of 5
I am thread 10 of 5
I am thread 12 of 5

Une légère ajuster à l'aide de l'arithmétique modulo vous permettra de faire de "fil X de Y" correctement:

// modulo gives zero-based results hence the +1
long threadId = Thread.currentThread().getId()%numThreads +1;

De nouveaux résultats:

burhan@orion:/dev/shm$ javac ThreadIdTest.java && java ThreadIdTest  
I am thread 2 of 5 
I am thread 3 of 5 
I am thread 3 of 5 
I am thread 3 of 5 
I am thread 5 of 5 
I am thread 1 of 5 
I am thread 4 of 5 
I am thread 1 of 5 
I am thread 2 of 5 
I am thread 3 of 5 

6voto

Vineet Reynolds Points 40529

Vous pouvez utiliser Thread.getCurrentThread.getId (), mais pourquoi voudriez-vous le faire lorsque les objets LogRecord gérés par le consignateur 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 journalisation.

1voto

Justin Ethier Points 57486

Si votre classe hérite de Thread , vous pouvez utiliser les méthodes getName et setName pour nommer chaque thread. Sinon , vous pouvez simplement ajouter un name champ MyTask , et l' initialiser dans votre constructeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X