如何解决获得对线程的控制权,然后杀死它
我有一个关于Java线程的问题。在我的代码中...
client.doSth();
// now need to get hold of the thread that is initiated by \'client\'
(get a reference to the \'client\' thread)
// now kills it
(kills the \'client\' thread)
...
所以我想知道的是:在第一个括号中,如何以编程方式获取对“'client \”线程的引用(不是程序正在运行的主线程),在第二个括号中,如何我应该正确地杀死它,即不使用已贬值的stop()方法。
非常感谢。
解决方法
编辑:
重读问题后,我不确定是否可以访问客户端代码。如果这样做,那么您可以对其进行修改,甚至不使用线程,而是使用
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
}
}
祝好运!
, 要显示线程树,请执行以下操作:
你可以这样:
// Find the root thread group
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
// Visit each thread group
visit(root,0);
// This method recursively visits all thread groups under `group\'.
public static void visit(ThreadGroup group,int level) {
// Get threads in `group\'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads*2];
numThreads = group.enumerate(threads,false);
System.out.println(\" \");
// Enumerate each thread in `group\'
for (int i=0; i<numThreads; i++) {
// Get thread
Thread thread = threads[i];
System.out.println(thread.toString());
}
// Get thread subgroups of `group\'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups*2];
numGroups = group.enumerate(groups,false);
// Recursively visit each subgroup
for (int i=0; i<numGroups; i++) {
visit(groups[i],level+1);
}
}
您可以选择调用显示指定Thread id的stackTrace的方法:
System.out.println(thread.dumpStack());
现在您有了要杀死的ID:
int idToKill = 2;
int active = Thread.activeCount();
System.out.println(\"currently active threads: \" + active);
Thread all[] = new Thread[active];
Thread.enumerate(all);
for (int i = 0; i < active; i++) {
System.out.println(i + \": \" + all[i]);
if(idToKill == i)
((Thread) all[i]).interrupt();
}
, 您可以在客户端中创建stpSth()方法并调用该方法以将其停止
public class Client(){
private Thread t;
volatile private boolean stop;//volatile to ensure visibility across threads
public doSth(){
stop=false;
Runnable r = new Runnable(){
@Override
public void run(){
while(!stop){
//do stuff and periodically and ensure that interrupts bubble through
}
}
};
t = new Thread(r);
t.start();
}
public void stopSht(){
stop=true;
t.interupt();
}
}
, 我在评论中看到您正在使用kryonet API。
kryonet为Client对象提供了stop()方法。如果使用start()启动客户端,则会创建一个线程,而stop()应该将其停止。
以下是启动和停止kryonet服务器和客户端的代码段,显示了进程中各个点的活动线程。 2秒睡眠是让线程在被要求停止时结束。
import java.io.IOException;
import java.util.Arrays;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Server;
public class KryonetAndThreads {
public static void main(String[] args) throws IOException,InterruptedException {
Server s = new Server();
s.start();
s.bind(1927);
printThreads(\"server started\");
Client c = new Client();
c.start();
c.connect(5000,\"LOCALHOST\",1927);
printThreads(\"client connected\");
Server s1 = s;
s.stop();
printThreads(\"server stopped\");
s = new Server();
s.start();
s.bind(1928);
printThreads(\"new server started\"); // new server thread will be last on
// the list.
c.stop();
printThreads(\"client stopped\");
c.start();
c.connect(5000,\"localhost\",1928);
printThreads(\"client connected to second server\");
c.stop();
s.stop();
s1.stop();
printThreads(\"both stopped\");
}
private static void printThreads(String message)
throws InterruptedException {
// tick:
Thread.sleep(2000L);
Thread[] threads = new Thread[Thread.activeCount()];
Thread.enumerate(threads);
System.out.println(message + \" : \" + Arrays.asList(threads));
}
}
, 如果doSth()
方法返回Thread对象,则可以执行以下操作;
Thread t = client.doSth();
t.interrupt();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。