Se si sono un'applicazione e non devono preoccuparsi di restrizioni SecurityManager, e se si sono preparati per modificare di tanto in tanto il codice quando il codice di terze parti viene aggiornato, è possibile utilizzare le strutture di ThreadGroup
per eseguire i thread e identificarli in base al nome o al gruppo di thread che li contiene.
Una volta individuati i thread, è semplice controllarli finché non sono terminati o utilizzare Thread.join()
in base alle esigenze.
Come esempio, qui è un codice di lavoro che scarica tutte le discussioni nella JVM:
public void printThreads(PrintWriter wtr) {
ThreadGroup root;
totGroups=0;
totThreads=0;
for(root=Thread.currentThread().getThreadGroup(); root.getParent()!=null; root=root.getParent()) {}
wtr.println("Thread Dump:");
printThreadGroup(wtr,root," ");
wtr.println(" -- Total Groups: "+totGroups+", Total Threads: "+totThreads);
}
public void printThreadGroup(PrintWriter wtr, ThreadGroup grp, String pfx) {
try {
Thread[] thds;
ThreadGroup[] grps;
totGroups++;
wtr.println(pfx+"Group: "+grp.getName()+", "+(grp.isDaemon()?"Daemon":"Normal")+", "+(grp.isDestroyed()?"Destroyed":"Alive")+", "+grp.getMaxPriority());
thds=new Thread[grp.activeCount()];
grp.enumerate(thds,false);
Arrays.sort(thds,THREAD_SORTER);
for(int xa=0; xa<thds.length && thds[xa]!=null; xa++,totThreads++) {
Thread thd=thds[xa];
wtr.println(pfx+". - ["+thd.getName()+", "+(thd.isDaemon()?"Daemon":"Normal")+", "+(thd.isAlive()?"Alive":"Not Started or Dead")+", "+thd.getPriority()+"]");
}
grps=new ThreadGroup[grp.activeGroupCount()];
grp.enumerate(grps,false);
Arrays.sort(grps,GROUP_SORTER);
for(int xa=0; xa<grps.length && grps[xa]!=null; xa++) {
printThreadGroup(wtr,grps[xa],(pfx+". "));
grps[xa]=null;
}
}
catch(Throwable thr) {
wtr.println(" Cannot print threads ("+thr+")");
}
}
public void printStacks(PrintWriter wtr) {
wtr.println("Thread Stack Traces:");
try { javaMx.printStacks(wtr); } catch(Throwable thr) { wtr.println(" Cannot print stacks ("+thr+")"); }
wtr.println(" --");
}
fonte
2014-12-17 01:23:11
Avresti bisogno di un qualche tipo di riferimento da aspettare. Come ad esempio una discussione, un futuro o la possibilità di installare una richiamata. Se la libreria non la espone, sarà difficile ... Forse qualcosa che puoi sondare ogni X secondi? – Thilo
Potrei sondarlo, ma come potrei sapere che sono finiti? Posso "spiare" i fili generati dopo il mio? – bsferreira
Voglio dire sondaggio fino a quando non vedi qualcosa che ti dice che questi thread hanno fatto tutto ciò che devono fare. Sei sicuro che la biblioteca non fornisce supporto per qualche tipo di notifica? Potresti ottenere risposte migliori se puoi dirci di quale biblioteca si tratta. – Thilo