Come trovare un filo Java in fase di esecuzione

July 5

L'arte di trovare le discussioni in fase di esecuzione coinvolge due classi Java, filo e ThreadGroup. Inoltre, è necessario ricordarsi di assegnare un nome al filo al momento della creazione. In caso contrario, se non il nome tuo thread, si fa affidamento sul meccanismo di denominazione predefinito per i thread costruiti in Java, e mentre si può essere in grado di indovinare quale sia il nome filo dovrebbe essere, non vi è alcuna garanzia che sarà lo stesso nome in tutta tutte le piattaforme di esecuzione e le versioni di Java.

istruzione

1 Creare il quadro per una classe di applicazione Java denominata "Trova". Basta fornire un metodo vuoto main () come punto di partenza.

public class Find {

void main (String args []) {pubblici statici

}

}

2 Creare un oggetto Runnable e filetto in modo da avere qualcosa da trovare. Nome del filo "Sleeper", fornendo un secondo argomento al costruttore Thread, dove il primo argomento è il riferimento Runnable. Dopo aver creato il filo, avviarlo chiamando il suo metodo start (). Il codice seguente inizia la definizione del metodo () principale ora-vuoto:

Runnable runner = new Runnable() {

public void run () {

provare {

Thread.sleep (50000);

} Catch (InterruptedException e) {

// ignorare

}

}

};

t thread = new Thread (corridore, "Sleeper");

t.start ();

3 Trova il filo con l'aiuto di ThreadGroup. Tutti i thread appartengono ad un ThreadGroup. Questi gruppi siedono in un albero in cui tutti i gruppi hanno un nodo padre (e bambini nodi), fatta eccezione per la radice dell'albero, che ha genitore. Supponendo che il filo di trovare non è in ThreadGroup del thread corrente, a piedi fino alla cima dell'albero, cercando in madre del gruppo. In questo modo, quando si va a trovare il filo "Sleeper", saprete che avete trovato in quanto tutte le discussioni attive saranno figli del filo genitore signore.

Thread currentThread = Thread.currentThread();

ThreadGroup gruppo = currentThread.getThreadGroup ();

while (group.getParent ()! = null) {

group = group.getParent ();

}

4 Utilizzare il metodo enumerate () di ThreadGroup per raggruppare tutti i fili figli di questo genitore eccellente. Il metodo memorizza i fili attivi in ​​un array.

int activeCount = group.activeCount();

activeThreads discussione [] = new Discussione [activeCount + 5];

int actualCount = group.enumerate (activeThreads);

5 Utilizzare la matrice activeThreads per aiutare a trovare il filo mancante - qui, quello contrassegnato "Sleeper". Una volta trovato, utilizzare il metodo dumpStack () per fornire un stacktrace del filo:

Thread found = null;

for (int i = 0; i & lt; actualCount; i ++) {

if (.equals "dormienti" (activeThreads [i] .getName ())) {

trovati = activeThreads [i];

rompere;

}

}

if (trovato! = null) {

found.dumpStack ();

}

6 Come la linea di chiusura per il metodo main (), dire al sistema per uscire dalla memoria:

System.exit (0);

7 Compilare ed eseguire il programma. Mentre i numeri di riga nella traccia dello stack potrebbero essere leggermente diverse in base al cose come stile parentesi, tutti dovrebbero fornire la stessa uscita generale.

java.lang.Exception: trace Pila

at java.lang.Thread.dumpStack(Thread.java:1206)

a Find.main (Find.java:31)