【问题标题】:Not able to stop execution无法停止执行
【发布时间】:2012-06-14 05:45:33
【问题描述】:

我开发了一个应用程序,旨在允许用户执行查询。一旦用户输入查询并单击执行按钮,控件就会传递给 RMI 服务器,然后启动线程。

用户应该能够一个接一个地执行其他查询,每个查询将在不同的线程中执行。

我无法停止线程的执行。我想在执行时停止执行,或者根据传递的线程 ID 在按钮单击事件上停止执行。 我正在尝试下面的代码

public class AcQueryExecutor implements Runnable {  
    private volatile boolean paused = false;     
    private volatile boolean finished = false;  
    String request_id="",usrnamee="",pswd="",driver="",url="";   

    public AcQueryExecutor(String request_id,String usrnamee,String pswd,String driver,String url) {  
        this.request_id=request_id;   
        this.usrnamee=usrnamee;   
        this.pswd=pswd;   
        this.url=url;   
        this.driver=driver;   
    }   

    public void upload() throws InterruptedException {   
        //some code                
        stop();
        //some more code
    }   

    public void run() {   
        try {   
            while(!finished) {   
                upload();   
            }
        } catch (InterruptedException e) {   
            e.printStackTrace();   
        }   
    }   

    public void stop() {
        finished = true; 
    }
}  

RMI 服务器类从我开始线程的地方

        public class ExecutorServer extends UnicastRemoteObject implements ExecutorInterface

        {
        public ExecutorServer()throws RemoteException
        {
        System.out.println("Server is in listening mode");
        }
        public void executeJob(String req_id,String usrname,String pwd,String driver,String url)throws RemoteException  
{
    try{
    System.out.println("Inside executeJob.wew..");
    AcQueryExecutor a=new AcQueryExecutor(req_id,usrname,pwd,driver,url);
    Thread t1 = new Thread(a);
    t1.start();
    }
    catch(Exception e)
    {
        System.out.println("Exception " + e);
    }

}           
        public void killJob(String req_id)throws RemoteException{
            logger.debug("Kill task");  
            AcQueryExecutor a=new AcQueryExecutor(req_id,"","","","");
    a.stop();
                    }


        public static void main(String arg[])
        {
        try{
            LocateRegistry.createRegistry(2007);
        ExecutorServer p=new ExecutorServer();
        Naming.rebind("//localhost:2007/exec1",p);
        System.out.println ("Server is connected and ready for operation.");
        }catch(Exception e)
        {
        System.out.println("Exception occurred : "+e.getMessage());
        e.printStackTrace();
        }
        }
               }

RMI 客户端

 ExecutorInterface p=(ExecutorInterface)Naming.lookup("//localhost:2007/exec1");
            System.out.println("Inside client.."+ p.toString());
                   p.executeJob(id, usrname, pswd);
                 p.killJob(id);
            }

直到我的知识 p.killJob() 将不会被调用,直到 executeJob() 完成。 我想在运行时停止执行

【问题讨论】:

  • 你如何停止线程?为什么upload()方法中间调用了stop()?
  • 我想检查一下在两者之间运行时我可以停止线程,只是为了检查我的停止块是否工作
  • 你知道线程在完成upload()方法之前不会响应任何stop()请求,对吧?您必须轮询 upload() 方法中的 finished 标志才能在那里中止。
  • 是的,这就是为什么我在上传方法中添加了 stop() ,该方法又将完成标志设置为 true。
  • 您正在创建许多不同的AcQueryExecutor 实例,但您没有在其中任何一个上调用a.stop()。您认为哪些stop() 消息被忽略了?

标签: java multithreading rmi interrupted-exception


【解决方案1】:

问题似乎是您正在为每个线程分配Runnable AcQueryExecutor 的新实例。这意味着每个人都看到了自己的finished 标志。在killJob 中设置一个不会导致任何其他线程退出,因为没有其他线程共享此标志。

您需要分享Runnables 或将finish 字段设为static。每当调用任何实例的 stop 时,后者都会导致所有线程退出,因此可能不是您想要的。

【讨论】:

  • 如何在不创建 AcQueryExecutor 的 frsh 实例的情况下执行此操作?我应该在哪里创建实例并共享它?
  • 在executeJob中创建AcQueryExecutor。然后想办法让它对killJob可见。您可以将它保存在 Server 类中(但是您的服务器一次只有一项工作正在进行;我无法从代码中判断这是否是预期的),或者您可以从 executeJob 返回它以用作传递给 killJob 的“句柄”。在后一种情况下,您可以向/从Object 转换以强调它只是一个句柄。您还可以在服务器中保留一个将字符串名称映射到 AcQueryExecutors 的注册表。
  • 应该有多个工作在异步进行中。我会试试你的建议。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2021-02-06
  • 2012-03-28
相关资源
最近更新 更多