Потоки Java: возможно ли просмотреть / приостановить / убить конкретный поток из другой программы Java, работающей на той же JVM?

У меня есть программа «foo», запускающая разные потоки, fooT1, fooT2, .. fooTn.

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

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

Система: Fedora Дистрибутив Linux

Примечание. Команды, запускающие JVM и программу foo, помещаются в /etc/init.d, и любой, кто имеет хорошее представление о структуре rc.1 / rc.2 / rc.3, может изменить / добавить к ним параметры запуска.

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

Вы спрашиваете нас, как обойти лицензирование коммерческого продукта? Сомневаюсь, что это допускается условиями использования Stackoverflow ...

Lars Westergren 08.10.2008 11:16

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

Lars Westergren 08.10.2008 11:21

Извините, что ответил так поздно, я хочу защитить определенный продукт (не свой собственный).

Swanand 20.05.2009 19:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
3
18 794
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Спасибо за ответ. Я просто хочу убедиться, что панель нет сможет завершить поток. Кажется, что Java действительно обеспечивает такую ​​безопасность.

Swanand 08.10.2008 23:27

Если кто-то хочет взломать ваш лицензионный код, он всегда может декомпилировать ваши классы и заменить его версией, которая пропускает проверку лицензии.

adib 14.08.2010 14:34

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

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

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

На самом деле отладчик 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, я пробовал очевидное:

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

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

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

("Swank REPL Thread" - это поток, который я хочу убить, и да, я сначала попытался приостановить его;)

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

Другие вопросы по теме