2008-10-08 15 views
7

我有一個程序'foo'運行不同的線程,fooT1,fooT2,.. fooTn。Java線程:是否可以查看/暫停/殺死在同一個JVM上運行的其他Java程序中的特定線程?

現在,如果我想寫另一個程序「酒吧」,這可能會殺死線程fooTr,這可能嗎?

原因:線程fooTr之一跟蹤產品許可證。如果此線程被殺害;人們可以無限期地運行這個產品。殺死'foo'本身就像'foo'一樣可以忍受,因爲這正是許可證到期時所做的。

系統:Linux

注意的Fedora發行版:它啓動JVM和程序富的命令都放在/etc/init.d中,誰擁有RC.1/rc.2/RC體面的知識.3結構可以改變/添加起始參數到這些。

我希望我的問題很清楚。如果不是,我總是可以編輯它。

+0

恩,所以你問我們如何繞過商業產品的許可?懷疑這是Stackoverflow使用條款允許的...... – 2008-10-08 07:16:20

+0

...或者你想知道如何保護自己的產品免於破解? – 2008-10-08 07:21:42

回答

4

據我所知,不可能直接做到這一點。然而,你可以考慮的是在'foo'上創建一些可以從'bar'中調用的服務來殺死線程。當然有數百種方法來實現這一點。我的第一個想法是使用RMI來做到這一點。

1

到目前爲止不可能運行到同一個JVM中的不同程序,但有些人正在研究它,以減少在同一臺機器上運行的不同java程序的啓動時間和內存和cpu使用率

3

即使沒有單獨的應用程序,您也可以這樣做。編寫您自己的啓動類,它將參數傳遞給應用程序的原始啓動類。儘管你的類的主要方法會創建一個線程,定期檢查所有線程的列表(例如,Thread.getAllStackTracesThread.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命令的語法,我已經試過了很明顯的:

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

,我得到消息:

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

(「斯旺克REPL線程」是我想殺死的線程,是的,我試着先暫停它)

我仍然無法將java調試器放在一邊,它在我看來像一個線程可以隨機殺死。也許你可以確保你忽略所有異常並繼續運行,這就足夠了,但我不確定。