0

ユーザーがクエリを実行できるようにすることを目的としたアプリケーションを開発しました。ユーザーがクエリを入力して実行ボタンをクリックすると、制御がRMIサーバーに渡され、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);
            }

私の知っているまで、executeJob()が終了するまでp.killJob()は呼び出されません。実行中に実行を停止したい

4

1 に答える 1

0

Runnable AcQueryExecutor問題は、スレッドごとにの新しいインスタンスを割り当てていることのようです。これは、それぞれが独自のfinishedフラグを見ていることを意味します。1つを設定するkillJobと、他のスレッドがこのフラグを共有しないため、他のスレッドが終了することはありません。

を共有するRunnableか、finishフィールドを作成する必要がありますstatic。後者の場合、インスタンスが呼び出されるたびにすべてのスレッドが終了するstopため、希望どおりでない場合があります。

于 2012-06-14T06:47:59.003 に答える