Подтвердить что ты не робот

Как убить поток Java с помощью VisualVM или с помощью команды unix?

Я использую ОС Windows 7. У меня есть около 6 потоков в моем приложении. Для тестирования предупреждений для проверки работоспособности потоков мне нужно вручную уничтожить потоки и проверить, работают ли предупреждения правильно. Можем ли мы убить поток, например, как мы убиваем процесс с помощью pid?

4b9b3361

Ответ 1

Не существует безопасного способа "убить" поток, не убивая процесс, в котором он находится. Это не то, что вы сделали бы намеренно. Для тестирования я бы добавил код в ваше приложение, чтобы поддержать это.

Ответ 2

Дэн Вудс задокументировал, как убить поток в этой записи в блоге... https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread Выполненные им шаги включали использование отладчика (JDB) и вложение исключения в выполнение потока. В частности...

  • Убедитесь, что ваша Java-программа запущена со следующими параметрами:

    -Dcom.sun.management.jmxremote.port = 50199
    -Dcom.sun.management.jmxremote.authenticate = ложь
    -Dcom.sun.management.jmxremote.ssl = ложь
    -Xrunjdwp: транспорт = транспорт по сокетам, адрес = 50100, сервер = у, приостановить = п

    Это позволит нам подключить java-отладчик к запущенному процессу, после мы определяем, какая тема вызывает эту проблему. Кроме того, убедитесь, что у вас есть соответствующая настройка iptables, чтобы разрешить соединения на 50100 и 50199 с хостов/рабочих станций, которыми вы управляете.

  • Определите оскорбительный поток:
  • Убейте нить. В этом примере ThreadName является "btpool0-0?". Запустите java-отладчик (также поставляемый с дистрибутивом JDK) и присоедините к запущенной JVM...

    [root @host ~] # jdb -attach 50100

Получить список запущенных потоков - это также даст нам идентификатор потока, который видит JVM:

> threads  
--snip--  
(org.mortbay.thread.BoundedThreadPool$PoolThread)0x25cb
btpool0-0 running  
--snip--

Идентификатор потока, который собирался убить, равен "0x25cb". Первым шагом убийства нитки является прыжок в нее и приостановление ее...

thread 0x25cb
btpool0-0[1] suspend 0x25cb
btpool0-0[1] step
Step completed: <... snip ...>
btpool0-0[1] kill 0x25cb new java.lang.Exception()
killing thread: btpool0-0
btpool0-0[1] instance of 
com.site.package.name(name='btpool0-0', id=9675) killed btpool0-0[1]

Выход из java-отладчика, и вы сделали!

Ответ 3

Как говорит Питер, вы не можете сделать это безопасно. Действительно, на некоторых платформах Thread.kill даже не реализовано. Однако:

  • Если это просто для тестирования, unit test, который называется Thread.kill, был бы разумным... если он работал на тестовых платформах, где он должен был работать. ( "Громкий" комментарий в исходном коде был бы для того, чтобы помочь людям портировать unit test...)

  • Другой альтернативой является добавление некоторого кода в выполняемый поток, который позволяет вашим модульным тестам сообщать ему о смерти. Если код потока должен быть (почти) производственным кодом для этого, вы можете создать подкласс, который переопределяет что-то, чтобы он "ломался" таким образом, который подходит вашим целям... для тестирования. Фактически, этот подход позволяет вам "разбить" потоки контролируемыми способами, что потенциально позволяет вам тестировать различные аспекты вашего кода оповещения.

Ответ 4

Вы не можете делать это снаружи (ОС или отладчик), вам придется написать свой собственный сторожевой сторож, который может взаимодействовать с пользователем и убить нужный поток.

Попробуйте найти здесь для обработки сигналов с помощью java

Ответ 5

Это неправда. Вы всегда можете подключиться к процессу JVM с помощью GDB и выполнить вызов pthread_kill, если знаете идентификатор потока. Вам нужно только перевести из дампа java thread (do kill-3), который дает вам шестнадцатеричный идентификатор (собственный идентификатор), а затем заглядывает в список потоков в GDB (информационные потоки) и находит реальный идентификатор потока.

Это доказано, что оно работает.

Ответ 6

В java вы не можете убить unix. Либо вы можете interrupt протектора в java, либо вы можете убить процесс в unix.

Ответ 7

Подождите некоторое время в потоке и уничтожьте поток в коде - простой способ.