Java 通过RMI从客户端停止线程
在创建服务器和客户机之后,我正在尝试熟悉RMI。我现在想创建一个方法,允许AdministratorClient停止线程(以防处理时间过长) 我试着用 中断() 但是当我得到所有线程的堆栈跟踪时,我仍然看到应该停止的线程 以下是Java 通过RMI从客户端停止线程,java,multithreading,rmi,Java,Multithreading,Rmi,在创建服务器和客户机之后,我正在尝试熟悉RMI。我现在想创建一个方法,允许AdministratorClient停止线程(以防处理时间过长) 我试着用 中断() 但是当我得到所有线程的堆栈跟踪时,我仍然看到应该停止的线程 以下是AdminMethod(在服务器中)的代码,我试图在其中实现killThread方法: import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import
AdminMethod
(在服务器中)的代码,我试图在其中实现killThread
方法:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Set;
public class AdminMethod extends UnicastRemoteObject implements AdminInterface{
protected AdminMethod() throws RemoteException {}
public String getThreadList() throws RemoteException {
Set<Thread> setOfThread =Thread.getAllStackTraces().keySet();
return setOfThread.toString();
}
public void killThread(long ThreadId) throws RemoteException {
Set<Thread> setOfThread = Thread.getAllStackTraces().keySet();
for(Thread thread : setOfThread){
if(thread.getId()==ThreadId){
thread.interrupt();
}
}
}
}
我已经看到了许多关于使用标志停止线程的方法的答案。但是我不知道如何实现它,因为线程是自动创建的,它不是一个自定义线程,我可以重写run()方法
你能告诉我怎么办吗?哪怕是一个暗示都可以!
谢谢这取决于您正在中断的线程的逻辑。如果它忽略了中断,我想你能做的就是尊重它的决定read
Thread
的doc plz,interrupt()
只需为线程设置一个标志,而不是停止它。我知道中断不起作用!这就是我来这里寻求帮助的原因,我不能只是“尊重”它不停止的决定,因为练习本身就是关于停止线程的。谢谢你非常有用的回答!任何关于停止线程的Java练习基本上都是错误的。只有让Java线程检查thread.interrupted()
和friends,然后退出,或者在它捕获InterruptedException
时退出,才能可靠地停止Java线程,这两种情况基本上都暗示是您编写的。RMI与此无关。上面的注释是线程需要停止的方式。但是(纯粹从学术角度来看),您可以使用Thread.stop()[此方法已被删除,有关原因的详细信息,请参阅javadoc],并查看该方法是否确实停止了线程并具有预期的行为[Thread.stop()不应在生产情况下使用]
import java.rmi.Naming;
import java.util.Scanner;
public class AdministrationClient {
public static void main (String[] args) {
AdminInterface AdminProxy;
try {
AdminProxy = (AdminInterface)Naming.lookup("rmi://localhost/CBA");
String ThreadList = AdminProxy.getThreadList();
System.out.println(""+ThreadList);
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un ID :");
long Id = sc.nextLong();
AdminProxy.killThread(Id);
System.out.println("Le thread "+Id+" a été correctement supprimé");
ThreadList = AdminProxy.getThreadList();
System.out.println(""+ThreadList);
sc.close();
}catch (Exception e) {
System.out.println("AdminClient exception: " + e);
}
}
}