Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / September 2006

Tip: Looking for answers? Try searching our database.

kill java thread and process

Thread view: 
anka - 11 Sep 2006 10:10 GMT
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


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.