Java 无法停止执行
我开发了一个应用程序,允许用户执行查询。一旦用户输入查询并单击执行按钮,控制权就会传递给RMI服务器,RMI服务器反过来启动线程 用户应该能够一个接一个地执行其他查询,每个查询将在不同的线程中执行 我无法停止线程的执行。我想在执行时停止执行,或者根据传递的线程id在按钮单击事件上停止执行。 我正在尝试下面的代码Java 无法停止执行,java,multithreading,rmi,interrupted-exception,Java,Multithreading,Rmi,Interrupted Exception,我开发了一个应用程序,允许用户执行查询。一旦用户输入查询并单击执行按钮,控制权就会传递给RMI服务器,RMI服务器反过来启动线程 用户应该能够一个接一个地执行其他查询,每个查询将在不同的线程中执行 我无法停止线程的执行。我想在执行时停止执行,或者根据传递的线程id在按钮单击事件上停止执行。 我正在尝试下面的代码 public class AcQueryExecutor implements Runnable { private volatile boolean paused = fa
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);
}
直到我的knowlegde p.killJob()完成后才会被调用。
我想在运行时停止执行问题似乎是您正在为每个线程分配一个新的
Runnable
AcQueryExecutor
。这意味着每个人都看到了自己的finished
标志。在killJob
中设置一个不会导致任何其他线程退出,因为没有其他线程共享此标志
您需要共享
Runnable
s或使finish
字段static
。无论何时调用任何实例的stop
,后者都会导致所有线程退出,因此这可能不是您想要的。如何停止线程?为什么上传()方法中间调用StUTE()?我想在中间运行的时候检查它,我可以停止线程,只是为了检查我的停止块是否正在工作,你知道线程不会对任何<代码> Stutter()/代码>请求做出响应,直到它完成<代码>上传()/<代码>方法,对吗?您必须轮询upload()
方法中的finished
标志才能在那里中止。是的,这就是为什么我在upload方法中添加了stop(),这反过来又将finished标志设置为true。您正在创建许多不同的AcQueryExecutor
实例,但您不会对其中任何一个实例调用a.stop()
。您认为忽略了什么stop()
消息?在不创建AcQueryExecutor的frsh实例的情况下如何执行此操作?我应该在何处创建实例并共享它?在executeJob中创建AcQueryExecutor。然后想办法让killJob看到它。您可以将其保存在服务器类中(但是您的服务器一次只有一个正在进行的作业;我无法从代码中判断这是否是预期的),或者您可以从executeJob返回它作为传递给killJob的“句柄”。在后一种情况下,您可以强制转换到对象
,以强调它只是一个句柄。您还可以在服务器中保留一个将字符串名称映射到AcQueryExecutors的注册表。应该有多个作业正在异步进行。我将尝试您建议的方法。谢谢