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.
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)