Ich habe einen festen Thread-Pool, an den ich Aufgaben sende (begrenzt auf 5 Threads). Wie kann ich herausfinden, welcher dieser 5 Threads meine Aufgabe ausführt (so etwas wie "Thread 3 von 5 erledigt diese Aufgabe")?
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
stattdessen verwendengetId()
ist ,14291
wo , wiegetName()
Sie gibtpool-29-thread-7
, die ich argumentieren würde mehr nützlich ist.Die akzeptierte Antwort beantwortet die Frage zum Abrufen einer Thread-ID, lässt Sie jedoch keine "Thread X of Y" -Nachrichten ausführen. Thread-IDs sind für alle Threads eindeutig, beginnen jedoch nicht unbedingt bei 0 oder 1.
Hier ist ein Beispiel, das zur Frage passt:
und die Ausgabe:
Eine leichte Änderung mit Modulo-Arithmetik ermöglicht es Ihnen, "Thread X von Y" korrekt auszuführen:
Neue Ergebnisse:
quelle
Sie können Thread.getCurrentThread.getId () verwenden, aber warum sollten Sie dies tun, wenn vom Logger verwaltete LogRecord- Objekte bereits die Thread- ID haben ? Ich denke, Sie vermissen irgendwo eine Konfiguration, die die Thread-IDs für Ihre Protokollnachrichten protokolliert.
quelle
Wenn Ihre Klasse von Thread erbt , können Sie Methoden verwenden
getName
undsetName
jeden Thread benennen. Andernfalls können Sie einfach einname
Feld hinzufügenMyTask
und es in Ihrem Konstruktor initialisieren.quelle
Wenn Sie die Protokollierung verwenden, sind Thread-Namen hilfreich. Eine Fadenfabrik hilft dabei:
Ausgabe:
quelle
Es gibt die Möglichkeit, aktuelle Threads zu erhalten:
Nachdem Sie das Thread-Klassenobjekt (t) erhalten haben, können Sie mithilfe der Thread-Klassenmethoden die benötigten Informationen abrufen.
Thread-ID erhalten:
Threadname gettting:
quelle