2008-10-08 4 views
7

У меня есть программа 'foo', запускающая разные потоки, fooT1, fooT2, .. fooTn.Java-потоки: возможно ли просмотреть/приостановить/убить конкретный поток из другой java-программы, запущенной на той же JVM?

Теперь, если я хочу написать еще одну «бар» программы, которая может убить поток fooTr, возможно ли это?

Причина: Один из путей fooTr отслеживает лицензию на продукт. Если эта нить убита; можно запустить этот продукт на неопределенный срок. И убийство «foo» само по себе является допустимым, как «foo», так как это именно то, что делается по истечении срока действия лицензии.

Система: Fedora Распределение Linux

Примечание: Команды, которые начинаются JVM и программы Foo находятся в /etc/init.d и тех, кто имеет приличное знание RC.1/РК-2/гс .3 может изменить/добавить к ним начальные параметры.

Надеюсь, мой вопрос ясен. Если нет, я всегда могу ее отредактировать.

+0

Ум, поэтому вы спрашиваете нас, как обойти лицензирование на коммерческий продукт? Сомнительно, что это разрешено условиями использования Stackoverflow ... – 2008-10-08 07:16:20

+0

... или вы хотите знать, как защитить свой собственный продукт от взлома? – 2008-10-08 07:21:42

ответ

4

Насколько мне известно, это невозможно сделать напрямую. Однако вы могли бы подумать о том, чтобы создать какой-то сервис на вашем «foo», который можно вызвать из «bar», чтобы убить поток. Конечно, есть сотни способов реализовать это. Моей первой мыслью было сделать это, используя RMI.

1

До сих пор не удается запустить разные программы в одном JVM, но некоторые люди следят за этим, чтобы сократить время запуска и использование памяти и процессора различными программами java, запущенными на одном компьютере

3

Вы можете сделать это даже без отдельного приложения. Напишите свой собственный класс запуска, который выполняет сквозной ввод параметров в исходный класс запуска приложения. Основной метод вашего класса, хотя и создавал бы поток, который периодически проверяет список всех потоков (например, Thread.getAllStackTraces или Thread.enumerate), находит встречный поток и вызывает на нем stop(). Хотя Thread.stop устарел, он по-прежнему работает.

Другой вариант - запустить приложение под отладчиком Java, скажем, jdb, а затем приостановить/уничтожить нужный поток. Вы также можете добавить параметры для запуска приложения, чтобы JVM можно было подключить, а затем подключить jdb к запущенной JVM и заподозрить/убить поток.

13

На самом деле отладчик java позволит вам убить поток, введя в него исключение. Я просто пытался выяснить, как использовать эту функцию, чтобы убить поток, не уничтожая весь jvm, когда я столкнулся с этим вопросом. При запуске JVM с параметрами командной строки, как:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 your.app.Main 

и подключить отладчик что-то вроде:

jdb -attach 127.0.0.1:8888 

вы можете набрать:

threads 

, чтобы получить список из запускать потоки и использовать команду kill, чтобы убить текущий поток.Бит я в настоящее время не уверен, что синтаксис этой команды убить, я попытался очевидное:

kill 0xe2e new java.lang.IllegalArgumentException("er"); 

и я получаю сообщения:

killing thread: Swank REPL Thread 
Thread not suspended 
Expression must evaluate to an object 

(«Суонк REPL тему» ​​является нить, которую я хочу убить, и да, я сначала попытался приостановить ее;)

Еще моя неспособность использовать отладчик java в стороне, мне кажется, что поток можно убить наугад. Возможно, вы можете просто удостовериться, что игнорируете все исключения и продолжаете работать, и этого будет достаточно, но я не уверен в этом.