Thread Java: è possibile visualizzare / mettere in pausa / uccidere un thread specifico da un programma Java diverso in esecuzione sullo stesso JVM?

StackOverflow https://stackoverflow.com/questions/181615

  •  05-07-2019
  •  | 
  •  

Domanda

Ho un programma 'foo' che esegue thread diversi, fooT1, fooT2, .. fooTn.

Ora, se voglio scrivere un altro programma 'bar', che potrebbe uccidere il thread fooTr, è possibile?

Motivo: uno dei thread fooTr tiene traccia della licenza del prodotto. Se questo thread viene ucciso; si può eseguire questo prodotto a tempo indeterminato. E uccidere "foo" è tollerabile come "foo" in quanto è esattamente ciò che viene fatto alla scadenza della licenza.

Sistema: Fedora Distribution of Linux

Nota: i comandi che avviano JVM e il programma foo sono inseriti in /etc/init.d e chiunque abbia una discreta conoscenza della struttura rc.1 / rc.2 / rc.3 può cambiare / aggiungere i parametri di partenza in questi.

Spero che la mia domanda sia chiara. In caso contrario, posso sempre modificarlo.

È stato utile?

Soluzione

Per quanto ne sappia, non è possibile farlo direttamente. Ciò che potresti considerare, tuttavia, è creare un tipo di servizio sul tuo "pippo" che può essere chiamato da "barra" per uccidere il thread. Esistono, ovviamente, centinaia di modi per implementarlo. Il mio primo pensiero sarebbe quello di farlo utilizzando RMI .

Altri suggerimenti

In realtà il debugger java ti permetterà di uccidere un thread iniettando un'eccezione in esso. Stavo solo cercando di capire come usare questa funzione per uccidere un thread senza cancellare l'intero jvm, quando mi sono imbattuto in questa domanda. Se esegui jvm con opzioni della riga di comando come:

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

e connetti il ??debugger con qualcosa del tipo:

jdb -attach 127.0.0.1:8888

puoi digitare:

threads

per ottenere un elenco dei thread in esecuzione e utilizzare il comando kill per uccidere un thread in esecuzione. Il bit di cui attualmente non sono sicuro è la sintassi di questo comando kill, ho provato l'ovvio:

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

e ricevo i messaggi:

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

(" Swank REPL Thread " è il thread che voglio uccidere, e sì, ho provato prima a sospenderlo;)

Ancora la mia incapacità di usare il debugger Java da parte, mi sembra che un thread possa essere ucciso a caso. Forse puoi solo assicurarti di ignorare tutte le eccezioni e continuare a correre e questo sarà sufficiente, ma non ne sono sicuro.

Puoi farlo anche senza un'applicazione separata. Scrivi la tua classe di avvio, che esegue un pass-through di parametri alla classe di avvio originale dell'applicazione. Il metodo principale della tua classe creerebbe comunque un thread che controlla periodicamente l'elenco di tutti i thread (ad es. Thread.getAllStackTraces o Thread.enumerate ), trova il thread offensivo e invoca stop () su di esso. Sebbene Thread.stop sia obsoleto, funziona ancora.

Un'altra opzione è eseguire l'applicazione con un debugger Java, ad esempio jdb e quindi sospendere / uccidere il thread richiesto. È inoltre possibile aggiungere parametri all'avvio dell'applicazione in modo che sia possibile collegare la JVM, quindi collegare jdb alla JVM in esecuzione e sospettare / interrompere il thread.

Fino ad ora non è possibile eseguire programmi diversi nella stessa JVM, ma alcune persone lo stanno studiando, al fine di ridurre i tempi di avvio e l'utilizzo della memoria e della CPU di diversi programmi Java in esecuzione nella stessa macchina

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top