How to stop threads, process, streams when closing a (internal) JFrame?

Dear all,
I read a Javaworld article about Runtime.exec(), which will output the process outputs and error outputs to either a file or System.out. Now I want to practice it by outputing the process output/error to a Swing JTextArea. It works fine if the process ends successfully.
My problem is that I want to stop all the output threads and clear all the streams when user click close JFrame button before the process finished. The code is shown below. Note that this frame is poped up by a click from another main frame. ( it is not exiting the main Swing application). This happened when I want to kill a process when it is running.
I tried to implements a WindowListener and add
public void windowClosing(WindowEvent e) to the JFrame.
Inside this method I used process.destroy() and errorGobbler = null, outputGobbler = null, or outputGobbler.interrupt(), errorGobbler.interrupt(). But all these seems does not work. Sometimes thread was not stopped, sometimes process was not destroyed (because the stream was still print out something), sometimes the error stream was not successfully closed - by printing out interruptted by user error message.
How can I make sure all the underlying streams and threads, including the PrintStream in StreamGobbler class are closed?
Again this Frame could be a Dialog or InternalFrame, i.e, when I close the frame, the main frame does not exit!
import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
    InputStream is;
    String type;
    OutputStream os;
    StreamGobbler(InputStream is, String type, JTextArea out)
        this(is, type, null, out);
    StreamGobbler(InputStream is, String type, OutputStream redirect, JTextArea out)
        this.is = is;
        this.type = type;
        this.os = redirect;
    public void run()
        try
            PrintWriter pw = null;
            if (os != null)
                pw = new PrintWriter(os);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                if (pw != null)
                    pw.println(line);
                out.append(type + ">" + line);   
            if (pw != null)
                pw.flush();
        } catch (IOException ioe)
            ioe.printStackTrace(); 
public class Test extends JFrame
    private JTextArea output;
    private StreamGobbler outputGobbler;
    private StreamGobbler errorGobbler;
    public Test (String file)
        super();
        output = new JTextArea();
        try
            FileOutputStream fos = new FileOutputStream(file);
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("java jecho 'Hello World'");
            errorGobbler = new
                StreamGobbler(proc.getErrorStream(), "ERROR", out);           
            outputGobbler = new
                StreamGobbler(proc.getInputStream(), "OUTPUT", fos, out);
            errorGobbler.start();
            outputGobbler.start();
            int exitVal = proc.waitFor();
            output.append("ExitValue: " + exitVal);
            fos.flush();
            fos.close();       
        } catch (Throwable t)
            t.printStackTrace();
     setSize(400,400);
     show();
}Thanks !

Thread.interrupt() doesn't stop a thread. You'll have to read the API for more specifics. You could use something like interrupt to force interruption of the thread for the reason of checking the terminating case though. I believe you would want to use this in the case where operations can take a long time.
Setting your reference to the thread to be null won't stop the thread since it's running. You just lose your reference to it.
I believe once the thread stops running your streams will be closed, but possibly not cleanly. Someone who has more knowledge of threads might be able to answer this better, but I would generally say clean up after yourself especially if you are writting out data.

Similar Messages

  • How to stop a process chain when its running?

    Dear Experts,
    How to stop a process chain when its running? is it that a chain can be stoppend when we open an info package of that chain ?
    Thank you,
    Raj

    Hi,
    Goto the main menu process chain --> choose the remove from the Schudule...
    Regards
    sathis
    I hope it helps to u... please assign the points

  • ADF how to display a processing page when executing large queries

    ADF how to display a processing page when executing large queries
    The ADF application that I have written currently has the following structure:
    DataPage (search.jsp) that contains a form that the user enters their search criteria --> forward action (doSearch) --> DataAction (validate) that validates the inputted values --> forward action (success) --> DataAction (performSearch) that has a refresh method dragged on it, and an action that manually sets the itterator for the collection to -1 --> forward action (success) --> DataPage (results.jsp) that displays the results of the then (hopefully) populated collection.
    I am not using a database, I am using a java collection to hold the data and the refresh method executes a query against an Autonomy Server that retrieves results in XML format.
    The problem that I am experiencing is that sometimes a user may submit a query that is very large and this creates problems because the browser times out whilst waiting for results to be displayed, and as a result a JBO-29000 null pointer error is displayed.
    I have previously got round this using Java Servlets where by when a processing servlet is called, it automatically redirects the browser to a processing page with an animation on it so that the user knows something is being processed. The processing page then recalls the servlet every 3seconds to see if the processing has been completed and if it has the forward to the appropriate results page.
    Unfortunately I can not stop users entering large queries as the system requires users to be able to search in excess of 5 million documents on a regular basis.
    I'd appreciate any help/suggestions that you may have regarding this matter as soon as possible so I can make the necessary amendments to the application prior to its pilot in a few weeks time.

    Hi Steve,
    After a few attempts - yes I have a hit a few snags.
    I'll send you a copy of the example application that I am working on but this is what I have done so far.
    I've taken a standard application that populates a simple java collection (not database driven) with the following structure:
    DataPage --> DataAction (refresh Collection) -->DataPage
    I have then added this code to the (refreshCollectionAction) DataAction
    protected void invokeCustomMethod(DataActionContext ctx)
    super.invokeCustomMethod(ctx);
    HttpSession session = ctx.getHttpServletRequest().getSession();
    Thread nominalSearch = (Thread)session.getAttribute("nominalSearch") ;
    if (nominalSearch == null)
    synchronized(this)
    //create new instance of the thread
    nominalSearch = new ns(ctx);
    } //end of sychronized wrapper
    session.setAttribute("nominalSearch", nominalSearch);
    session.setAttribute("action", "nominalSearch");
    nominalSearch.start();
    System.err.println("started thread calling loading page");
    ctx.setActionForward("loading.jsp");
    else
    if (nominalSearch.isAlive())
    System.err.println("trying to call loading page");
    ctx.setActionForward("loading.jsp");
    else
    System.err.println("trying to call results page");
    ctx.setActionForward("success");
    Created another class called ns.java:
    package view;
    import oracle.adf.controller.struts.actions.DataActionContext;
    import oracle.adf.model.binding.DCIteratorBinding;
    import oracle.adf.model.generic.DCRowSetIteratorImpl;
    public class ns extends Thread
    private DataActionContext ctx;
    public ns(DataActionContext ctx)
    this.ctx = ctx;
    public void run()
    System.err.println("START");
    DCIteratorBinding b = ctx.getBindingContainer().findIteratorBinding("currentNominalCollectionIterator");
    ((DCRowSetIteratorImpl)b.getRowSetIterator()).rebuildIteratorUpto(-1);
    //b.executeQuery();
    System.err.println("END");
    and added a loading.jsp page that calls a new dataAction called processing every second. The processing dataAction has the following code within it:
    package view;
    import javax.servlet.http.HttpSession;
    import oracle.adf.controller.struts.actions.DataForwardAction;
    import oracle.adf.controller.struts.actions.DataActionContext;
    public class ProcessingAction extends DataForwardAction
    protected void invokeCustomMethod(DataActionContext actionContext)
    // TODO: Override this oracle.adf.controller.struts.actions.DataAction method
    super.invokeCustomMethod(actionContext);
    HttpSession session = actionContext.getHttpServletRequest().getSession();
    String action = (String)session.getAttribute("action");
    if (action.equalsIgnoreCase("nominalSearch"))
    actionContext.setActionForward("refreshCollection.do");
    I'd appreciate any help or guidance that you may have on this as I really need to implement a generic loading page that can be called by a number of actions within my application as soon as possible.
    Thanks in advance for your help
    David.

  • How to stop a process (that is executing)

    Hi all
    my question is How to stop a process that is executing ?
    some other languages has a function called yield() in java how I can do it.
    thanks

    You can tell a Thread to yield - That is, cause the currently executing thread object to temporarily pause and allow other threads to execute.

  • HOW TO STOP THE PROCESS CHAIN WHICH IS RUNNING IN THE PRODUCTION?

    HI ALL,
    CAN ANYONE TELL ME HOW TO STOP THE PROCESS CHAIN WHICH IS RUNNING DAILY AT 5.00 PM. I NEED TO STOP THE PROCESS CHAIN FOR COUPLE OF DAYS AND THEN RESTART IT AGAIN.
    cAN ANYONE TELL ME THE PROCEDURE TO STOP THE ENTIRE PROCESS CHAIN RUNNING IN THE PRODUCTION.
    THANKS
    HARITHA

    Hi,
    First and foremost let me advice you to be very careful while doing this.
    For Rescheduling
    RSPC> chain > Goto > Planning view and
    click on Execution tab > select > Remove from Schedule and then in Maintain variant of start process reschedule for the day you require it to run.
    For terminating active chain
    You can start from SM37, find the process WID/PID then go to SM50 or SM51 and kill it. Once its done come back to RSMO and check the request, it should be red but again manually force to red and save by clicking on the total status button in the status tab. This shuld ensure that the process is killed properly.
    The next step will be to go to targets that you were loading and remove the red requests from those targets.
    Note: For source system loads you may have to check if the request is running in the source system and kill if needed and pull it again.
    But for BW datamart delta loads u may have reset the datamarts in case u are going to pull the delta again.
    Re: Kill a Job
    Re: Killing a process chain.
    Regards,
    JituK

  • How to stop the process chain showing status as yellow but no process step

    Dear Friends,
    How to stop the process chain showing status as yellow but no process step is running in that process chain.
    We have manually triggered the process chain for sales it finished successfully till load data but the next step is create index and DB statistics. Both of this steps are in unscheduled position only and no background job for this.
    Please guide me.
    Thanking you in advance.
    Regards,
    Shubhangi

    Hi,
      At times even I have faced this situation.  During those times, running the Function module RSPC_PROCESS_FINISH by passing the right parameters came to my rescue.
    Regards,
    Raj

  • How to stop a process in process chain

    Can anyboday help , How to stop a process in process chain .
    Thanks
    PP

    Hi Phani
    In RSPC, Open the Meta Chain, In Process Chain Manu bar,
    Select the option "Remove From Schedule"
    Hope this will help you
    Regards
    Saravanan.ar

  • How to Stop the process chain if it in the middle of the process?

    Hi,
    Is there anyway that i can stop the process chain if it is in the middle of the process already?
    Raj

    "Hi,
    First and foremost let me advice you to be very careful while doing this.
    You can start from SM37, find the process WID/PID then go to SM50 or SM51 and kill it. Once its done come back to RSMO and check the request, it should be red but again manually force to red and save by clicking on the total status button in the status tab. This shuld ensure that the process is killed properly.
    The next step will be to go to targets that you were loading and remove the red requests from those targets.
    Note: For source system loads you may have to check if the request is running in the source system and kill if needed and pull it again.
    But for BW datamart delta loads u may have reset the datamarts in case u are going to pull the delta again.
    Different Ways to stop process chain
    1)SM37 -->Kill Job
    2)SM50/sm66- ->Kill process
    3)RSPC>Job Log>Make the process RED forecefully.
    4)RSPC>Process chain> main Menu"Remove from Scheduling" OR
    5)se37-->RSPC_API_CHAIN_INTERRUPT
    give RFC BW system name(technical) and process chain name(technical)
    Steps 1 -3 stops the chain running in process
    Steps 4-5 stops the chain AFTER the current job which is running is completed as sucessful or Failure by nature.
    Rationale - 4-5
    This function will only remove the jobs from schedule, which did not yet run. It will not kill running jobs, as this may leave the system in an inconsistent state, moreover killing processes is possible for synchronous processes only anyhow. This means, that there will be no errors with interrupted chains, which on the other
    hand means an interrupted chain is not restartable. So for a running chain this function is intended to be an emergency break only. You can use it, however, to remove a scheduled chain from schedule, such that it does not start except by your product.
    Re: Kill a Job
    Re: Killing a process chain.
    How to stop a process in a process chain?
    Regards,
    JituK

  • Could somebody please advice how to stop the pages dropping ,when l go on ebay ,utube etc

    could somebody please advice how to stop the pages dropping ,when l go on ebay ,utube etc

    could somebody please advice how to stop the pages dropping ,when l go on ebay ,utube etc

  • How to stop iphone from autoplay when plug into car audio system usb?

    how to stop iphone from autoplaying when connected to your car audio USB ?

    You need to remove the association that Windows has with that particular file type. To do that, you need to open Windows Explorer. From there, click on Tools, then Folder options. Click on the tab that is named file types. You then need to find the extension for the photos that appear in the iPhone, then click that registered file type. Once you do that, there is a section to select the program to open that file type with. You can click on the change button, and that will allow you to change the program that it opens with, or restore the default. There is also a box that can be checked to always use the selected program. If you unselect it, it will prompt you next time on what program to use.
    Hope this helps.

  • How to popup a prompt dialog when closing IE?

    Hello,every one
    How to popup a prompt dialog when closing IE by clicking the "Cross"(close) of the left-up corner?
    can you give me any suggestions?
    Thnak you!
    zhongboqing

    hi,everyone,
    I am wrong. It should be:
    How to popup a prompt dialog when closing IE by clicking the "Cross"(close) of the right-up corner?
    thank you!

  • How to stop/cancel Process Chain in BI 7.0

    Hi,
    Could you tell me how to stop/cancel a process chain that hangs with status yellow or green in BI 7.0? There was an easy option to do it in 3.x, but I cannot find a similar option in 7.0.
    What happens is that at random our process chains hang at a certain variant with either yellow or even green status and do not proceed further. What happens is that in a couple of hours another pchain run occurs and it executes fine. Then again at random (might be the same day or the next day) the process chain hangs again. I think that all those "hanged" pchains pile up in the queue, so that it cause other future pchains to hang as well at some point. So, is there anyway to stop/cancel these zombie process chains when it stops at a particular event RSPROCESS in BI 7?
    Thank you,
    AG
    Message was edited by:
            AG

    Hi Frank,
    Thanks for your reply. I have a few questions.
    1)SM37 -->Kill Job
    We cannot do that because the job has already finished.
    2)SM50/sm66- ->Kill process
    There are no hanged processes to kill
    3)RSPC>Job Log>Make the process RED forecefully
    How do you do that exactly?
    4)RSPC>Process chain> main Menu"Remove from Scheduling"  OR
    5)se37-->RSPC_API_CHAIN_INTERRUPT
    give RFC BW system name(technical) and process chain name(technical) - we can do this,  but what exactly would it accomplish. Would it remove the process chain from any runs in the future or also any hanged ones in the past? An how is this step different from #4?
    Thank you,
    AG

  • How to stop a process?

    last time i selected all the files in a folder and expected them to open in one Preview window, but each opened a window and it took a long time. When this happens, how can i stop the process immediately?

    Quit the application using CMD+Q. If that doesn't work, OPTION-click the app's Dock icon, and select force quit.

  • How to stop a process in a process chain?

    Hi
    I've got a process chain that calls several processes.  It's still running one of the processes but I want to stop the two that will run after (as it is now in the day time and they will impact on performance in our R3 system).
    I've looked on SM37 but when I put in BI_* nothing comes up.  Do anyone know how I can stop these processes from running before they start ?
    Thanks in advance
    Sandra

    Hi Sandra,
    Just goto the process types that are supposed to run afterwards... and rt click select released job-> select the job and press shift + F6 (from scheduled state to release state)
    If u observe in PC now after refreshing this step will not be green (grey meaning not scheduled to run)
    similar for other.
    thanks

  • How to stop an infinite Stream?

    I have a Stream instace which produces values using an infinite Supplier (it supplies values taken from an electronic sensor -- so unless the battery is low, the sensor will provide "for ever").
    The stream is processed by a Collector using Stream.collect() (e. g. imagine that the values from the sensor should be averaged; in fact what it does is a bit more compliacted maths).
    The problem is that the collector does not produce a result but hangs up, as the supplier does never stop providing more sensor values.
    So what I need is a limitation rule that stops the stream. While there is a Stream.limit(long) method, it actually does not solve my problem as in my case it is not practical to stop after a particular count, while I actually want to stop streaming when the sensor value exceeds a particular limit etc. (hence, voids an arbitrary rule).
    To sum up, what I need is Stream.limit(Predicate), i. e. the stream will stopped once the predicate becomes true.
    Unfortunately I did not find anything like that in JRE 8. :-(
    Is that planned for JRE 8.1 or JRE 9.0? Or is there a known (and sophisticated) workaround?
    Thanks!
    -Markus

    Would something like this do the trick?
    Stream.anyMatch((v) => {v > 1000})

Maybe you are looking for

  • My iPod Touch 2G 4.2.1 is acting up on me. What can I do?

    I have an iPod Touch 2G with an iOS of 4.2.1. I've had it since 2011, when I found it slightly beaten up but still usable in the bottom of an old sofa chair. I think that one of my relatives accidentally let it slip from their pocket, but that's anot

  • What are the possible causes of following errors in MAX? Are there any references on how to use MAX?

    Hi, it's me again. I've checked the encoder response in MAX (-ve ccw, +ve cw) and it seems fine. But when the motor moves MAX will generate a following error message. Is my encoder causing the problem or have I made a mistake in the settings? I've ch

  • Users getting synced with wrong upn with office 365

    i have users on premise, already registered domain @abc.com, use which are synced with office should also come with @abc.com, but its stamping with @abc.onmicrosoft.com, where to check to fix it? thanks

  • FM to Round decimal place

    Hi Gurus, I want to reduce the number of decimal place by rounding off 2 decimal place. I am using 'HR_NZ_ROUNDING_DECIMALS' function module but its not working, kindly do the needful. Regards, Maithili

  • How to stop automatic LR opening?

    Whenever I plug in an EHD I now find that LR 4 opens automatically. That was not the case last week so this is new and I cannot find a setting in Preferences to turn off. Can you tell me where that setting is located?