kill java thread and process

A

anka

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
 
G

Gordon Beaton

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
 
A

anka

Gordon Beaton a écrit :
The following line may be related to your problem:


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
 
A

anka

Gordon Beaton a écrit :
The following line may be related to your problem:


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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top