Hi all,
I am developping a client server application and I am stuck in a kill
thread/process problem; in my client I start a calculation process
(trough a button), wich will launch a process to do this task; after
the process finishes all computations, the results are displayed into
client window and I kill the process;
I have also a stop button that must stop the process (kill him) - and
by default not display results .
Somehow a can't manage to kill the process BEFORE the he finishes the
computation, but after that. the actual behaviour is the following: the
procces is launched (start button pushed) in the background, I press
stop button but the result are still displayed in the client window and
the process is killed after that.
Here is my code :
public class ProcessMonitoring {
public static Process p;
public static Timer timer;
public static KillingTask killTask;
public static Thread waitForProcess;
public static void exec(File engineDir, String engineName, File
workingDir, long timeOut)
throws ProcessMonitoringException{
try {
p = Runtime.getRuntime().exec((new File(engineDir,
engineName)).getAbsolutePath(),null,workingDir);
waitForProcess = new MonitorThread(p);
waitForProcess.setName("computation thread");
timer = new Timer(false);
killTask = new KillingTask(p, waitForProcess);
timer.schedule(killTask,timeOut);
StreamGobbler stderr = new StreamGobbler(p.getErrorStream(),
StreamGobbler.ERROR);
StreamGobbler stdin = new StreamGobbler(p.getInputStream(),
StreamGobbler.INPUT);
stderr.start();
stdin.start();
waitForProcess.start();
waitForProcess.join(timeOut);
killTask.cancel();
timer.cancel();
p.destroy();
Logger.getInstance().trace("Exit code: " + p.exitValue());
if (((MonitorThread)waitForProcess).hasBeenInterrupted() ||
p.exitValue() != 0 )
throw new ProcessMonitoringException("processinterrupted");
} catch (IOException e) {
Logger.getInstance().warn("TROUBLE TO FIND ENGINE EXEC\n", e);
throw new ProcessMonitoringException("execnotfound", e);
} catch (InterruptedException e) {
Logger.getInstance().warn("TROUBLE WITH ENGINE PROCESS\n", e);
throw new ProcessMonitoringException("processinterrupted", e);
} catch (ProcessMonitoringException e) {
throw e;
} catch (Exception e) {
Logger.getInstance().warn("UNKNOWN ERROR\n", e);
throw new
ProcessMonitoringException("unknownprocessmonitoringexception", e);
}
}
public static void kill(File engineDir, String engineName, File
workingDir) throws ProcessMonitoringException{
try {
if(waitForProcess.getName() == "computation thread"){
waitForProcess.interrupt();
killTask.cancel();
timer.cancel();
p.destroy();
}
} catch (Exception e) {
Logger.getInstance().warn("UNKNOWN ERROR\n", e);
throw new
ProcessMonitoringException("unknownprocessmonitoringexception", e);
}
}
}
class MonitorThread extends Thread{
private Process p;
private boolean hasBeenInterrupted = false;
public MonitorThread(Process process){
super();
p = process;
}
public void run(){
try {
p.waitFor();
} catch (InterruptedException e) {
Logger.getInstance().warn("This process has been interrupted.
\n"+e);
hasBeenInterrupted = true;
}
}
public boolean hasBeenInterrupted(){
return hasBeenInterrupted;
}
}
class KillingTask extends TimerTask{
private Process process;
private Thread thread;
public KillingTask(Process p, Thread t){
super();
process = p;
thread = t;
}
public void run() {
Logger.getInstance().warn("Interrupting process. ");
process.destroy();
thread.interrupt();
}
}
ProcessMonitoring exec and kill functions are called within client side
(start/stop button)
Thank you for your help
Anka
Gordon Beaton - 11 Sep 2006 10:19 GMT
> Somehow a can't manage to kill the process BEFORE the he finishes the
> computation, but after that. the actual behaviour is the following: the
> procces is launched (start button pushed) in the background, I press
> stop button but the result are still displayed in the client window and
> the process is killed after that.
> Here is my code :
The following line may be related to your problem:
> if(waitForProcess.getName() == "computation thread"){
Compare strings for equality using String.equals(), not == (which
compares them for identity).
/gordon

Signature
[ don't email me support questions or followups ]
g o r d o n + n e w s @ b a l d e r 1 3 . s e
anka - 11 Sep 2006 11:52 GMT
Gordon Beaton a écrit :
> > Somehow a can't manage to kill the process BEFORE the he finishes the
> > computation, but after that. the actual behaviour is the following: the
[quoted text clipped - 9 lines]
> Compare strings for equality using String.equals(), not == (which
> compares them for identity).
this is not the cause for that, the kill is still made after displaying
the result and not before.
i mention that displaying in gui is made after the computation process
dies on his own, this operations doesn't take part of my process.
somehow, i belive that my stop button event is taken in count after the
result is shown in client, wich is not normal
anka - 11 Sep 2006 11:53 GMT
Gordon Beaton a écrit :
> > Somehow a can't manage to kill the process BEFORE the he finishes the
> > computation, but after that. the actual behaviour is the following: the
[quoted text clipped - 9 lines]
> Compare strings for equality using String.equals(), not == (which
> compares them for identity).
this is not the cause for that, the kill is still made after displaying
the result and not before.
i mention that displaying in gui is made after the computation process
dies on his own, this operations doesn't take part of my process.
somehow, i belive that my stop button event is taken in count after the
result is shown in client, wich is not normal