2013-08-14 9 views
7

Ho lavorato in JMX java e ottengo tutti gli ID di thread utilizzando il metodo getAllThreadIds() dell'interfaccia ThreadMXBean ma ho bisogno di un modo per eliminare il thread di un determinato ID. per esempio:Ottenere una discussione da Id

ThreadMXBean tbean; 
    tbean = ManagementFactory.getThreadMXBean(); 
    long[] IDs=tbean.getAllThreadIds(); 
    //.... i need a way to kill the Threads wich have this IDs 

plz help me Grazie

risposta

2

V'è in realtà un buon modo per uccidere un filo in Java. È stata utilizzata un'API denominata Thread.stop() ma è anche deperita. Controlla questo link per maggiori dettagli perché Thread.stop non è valido e come dovremmo interrompere un thread.

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

ottenere solo l'ID non vi aiuterà, è necessario avere il riferimento all'oggetto thread per impostare un flag per fermare quel filo.

2

È possibile utilizzare questo metodo:

static Map<Thread,StackTraceElement[]> getAllStackTraces() 

per ottenere tutte le discussioni, poi mappa Traverse a chiave e trovare filo appropriata.

Ma questo è un approccio molto cattivo. Come hai intenzione di interrompere il thread? Utilizzare il metodo void stop()? L'id suggerisce di utilizzare l'Executor framework insieme al meccanismo di interruzione.

2

Thread.getAllStackTraces restituisce tutte le tracce di stack di tutti i thread attivi Map<Thread,StackTraceElement[]>. Questi dovrebbero essere gli stessi thread restituiti da ThreadMXBean. È possibile estrarre i thread da questa mappa e interromperli. Nota che non esiste alcun metodo legale in Java per uccidere un thread.

8

Si può provare questo:

public void printAllThreadIds() { 
    Thread currentThread = Thread.currentThread(); 
    ThreadGroup threadGroup = getRootThreadGroup(currentThread); 
    int allActiveThreads = threadGroup.activeCount(); 
    Thread[] allThreads = new Thread[allActiveThreads]; 
    threadGroup.enumerate(allThreads); 

    for (int i = 0; i < allThreads.length; i++) { 
     Thread thread = allThreads[i]; 
     long id = thread.getId(); 
     System.out.println(id); 
    } 
} 

private static ThreadGroup getRootThreadGroup(Thread thread) { 
    ThreadGroup rootGroup = thread.getThreadGroup(); 
    while (true) { 
     ThreadGroup parentGroup = rootGroup.getParent(); 
     if (parentGroup == null) { 
      break; 
     } 
     rootGroup = parentGroup; 
    } 
    return rootGroup; 
} 

Ma si dovrebbe interrompere una Thread e non stop esso.

Il metodo Thread.stop() è obsoleto perché uccide immediatamente un Thread. Pertanto, le strutture di dati attualmente modificate da questo Thread potrebbero rimanere in uno stato incoerente. L'interruzione dà al filo la possibilità di spegnersi con grazia.