thread resueltos reiniciar pausar hilos fuente entre ejemplos diferencia detener como codigo java multithreading jvm

resueltos - Hilos de Java: ¿es posible ver/pausar/matar un hilo en particular de un programa Java diferente que se ejecuta en la misma JVM?



hilos en java netbeans (4)

Hasta ahora no es posible ejecutar programas diferentes en la misma JVM, pero algunas personas lo están investigando, con el fin de reducir el tiempo de inicio y la memoria y el uso de la CPU de diferentes programas de Java que se ejecutan en la misma máquina

Tengo un programa ''foo'' ejecutando diferentes hilos, fooT1, fooT2, .. fooTn.

Ahora si quiero escribir otro programa ''bar'', que podría matar al hilo fooTr, ¿es posible?

Motivo: uno de los hilos fooTr rastrea la licencia del producto. Si este hilo se mata; uno puede ejecutar este producto indefinidamente. Y matar a ''foo'' en sí mismo es tolerable como ''foo'', ya que es exactamente lo que se está haciendo en el vencimiento de la licencia.

Sistema: Fedora Distribución de Linux

Nota: Los comandos que inician JVM y el programa foo se ubican en /etc/init.d y cualquiera que tenga un conocimiento decente de la estructura rc.1 / rc.2 / rc.3 puede cambiar / agregar los parámetros iniciales a estos.

Espero que mi pregunta sea clara. Si no, siempre puedo editarlo.


Puedes hacer esto incluso sin una aplicación por separado. Escriba su propia clase de inicio, que realiza un traspaso de parámetros a la clase de inicio original de la aplicación. Sin embargo, el método principal de su clase crearía un hilo que verifica periódicamente la lista de todos los hilos (por ejemplo, Thread.getAllStackTraces o Thread.enumerate ), busca el hilo ofensivo e invoca a stop() en él. Aunque Thread.stop está en desuso, todavía funciona.

Otra opción es ejecutar la aplicación bajo un depurador Java, por ejemplo, jdb y luego suspender / matar el hilo requerido. También puede agregar parámetros al inicio de la aplicación para que se pueda adjuntar a la JVM, luego adjuntar jdb a la JVM en ejecución y sospechar / eliminar el hilo.


En realidad, el depurador de Java te permitirá eliminar un hilo al inyectar una excepción en él. Estaba intentando averiguar cómo usar esta función para matar un hilo sin borrar todo el jvm, cuando me encontré con esta pregunta. Si ejecuta el jvm con opciones de línea de comando como:

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

y conecta el depurador con algo como:

jdb -attach 127.0.0.1:8888

puedes escribir:

threads

para obtener una lista de los hilos en ejecución, y use el comando kill para matar un hilo en ejecución. El bit del que actualmente no estoy seguro es la sintaxis de este comando kill, he intentado lo obvio:

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

y recibo los mensajes:

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

("Swank REPL Thread" es el hilo que quiero matar, y sí, he intentado suspenderlo primero;)

Todavía mi inhabilidad de usar el depurador de Java a un lado, me parece que un hilo se puede matar al azar. Tal vez puedas asegurarte de ignorar todas las excepciones y seguir corriendo, y eso será suficiente, pero no estoy seguro de eso.


Que yo sepa, no es posible hacer esto directamente. Sin embargo, lo que podrías considerar es crear algún tipo de servicio en tu ''foo'' que pueda invocarse desde ''bar'' para eliminar el hilo. Hay, por supuesto, cientos de formas de implementar esto. Mi primer pensamiento sería hacer esto usando RMI .