Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过RMI从客户端停止线程_Java_Multithreading_Rmi - Fatal编程技术网

Java 通过RMI从客户端停止线程

Java 通过RMI从客户端停止线程,java,multithreading,rmi,Java,Multithreading,Rmi,在创建服务器和客户机之后,我正在尝试熟悉RMI。我现在想创建一个方法,允许AdministratorClient停止线程(以防处理时间过长) 我试着用 中断() 但是当我得到所有线程的堆栈跟踪时,我仍然看到应该停止的线程 以下是AdminMethod(在服务器中)的代码,我试图在其中实现killThread方法: import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import

在创建服务器和客户机之后,我正在尝试熟悉RMI。我现在想创建一个方法,允许AdministratorClient停止线程(以防处理时间过长)

我试着用

中断()

但是当我得到所有线程的堆栈跟踪时,我仍然看到应该停止的线程

以下是
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);
                }

        }
}