2013-08-14 5 views
7

Я работал в JMX java, и я получаю все идентификаторы потоков с помощью метода getAllThreadIds() интерфейса ThreadMXBean, но мне нужен способ убить нить данного идентификатора. , например:Получить тему от Id

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

плз помочь мне Спасибо

ответ

2

Там на самом деле не хороший способ убить поток в Java. Используется api, называемый Thread.stop(), но он также отменяется. Проверьте эту ссылку, чтобы узнать, почему Thread.stop был плохим и как мы должны останавливать поток.

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

Как только идентификатор потока не поможет, вы должны иметь ссылку на объект поток, чтобы установить флаг, чтобы остановить этот поток.

2

Вы можете использовать этот метод:

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

, чтобы получить все нити, затем траверс карты с помощью ключа и найти соответствующую резьбу.

Но это очень плохой подход. Как вы собираетесь остановить поток? Используя метод void stop()? Id предлагает использовать инфраструктуру Executor в сочетании с механизмом прерывания.

2

возвращает все следы стека всех живых потоков Map<Thread,StackTraceElement[]>. Они должны быть теми же потоками, что и ThreadMXBean. Вы можете извлечь потоки с этой карты и прервать их. Обратите внимание, что в Java нет законного метода для уничтожения потока.

8

Вы можете попробовать это:

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; 
} 

Но вы должны прерывать Thread и не stop его.

Метод Thread.stop() устарел, поскольку он немедленно убивает Thread. Таким образом, структуры данных, которые в настоящее время изменены этим Thread, могут оставаться в несогласованном состоянии. Прерывание дает фильму возможность изящества.

Смежные вопросы