編輯: 重讀的問題後,我不知道任何更多,如果你有機會到客戶端的代碼。如果你這樣做,那麼你可以修改它,甚至不使用線程,但java.util.concurrent.ExecutorService
或類似的..但
由於代碼不是你自己的...你是在你自己停止它。
ThreadGroup類是專爲。管理部分程序或模塊並不容易,通常需要一些已經建立的框架。確保一些第三方代碼的行爲良好,並不總是可能的。它應該包括上下文類加載器和什麼不是,但這裏是它的完成過程的簡化版本。
儘管如此,你仍然可以做些什麼來打破入侵者的骨骼。假設已經使用了stop()/ close()等,在日誌記錄等一些技巧像ThreadDeath。
ThreadGroup g=new ThreadGroup("client X group");
Runnable r=new Runnable(){
public void run(){
client.doSmth();//assuming a new thread is started...
}
}
Thread t= new Thread(g, r, "clientStarter");
t.start();
//stopping, last resort code, it's usually more complicated than just thread.stop, though
//now you can enumerate threads of the ThreadGroup
synchronized(g){//sync ensures no more threads will be created, use it w/ extreme caution
Thread[] threads = new Thread[g.activeCount()];
for(Thread thread:threads){
if(thread==null) break;
thread.stop();//
//cannot join in sync of ThreadGroup, do not use it here
}
}
祝你好運!
'doSth()'方法是否返回一個Thread對象? – 2011-05-30 11:53:53
你爲什麼不''客戶端'返回一個'Thread'?沒有這些,你如何期望能夠確定正確的線程? – 2011-05-30 11:54:03
@Oli Charlesworth:事情是客戶端對象是由我使用的第三方庫創建的,所以我不能修改它的行爲,並且在這種情況下,爲了讓它返回由'客戶端'對象啓動的線程。 – skyork 2011-05-30 12:25:41