Waiting on unknown threads to finish

I have made the ExecutionService class, and now i have a small problem. The point of the class was to split the job normally done by one thread into as many as possible. Now, i need the thread that called executeInstantly/waitToExecute to wait until the requested task(s) are done, and there are no more tasks to process. What would be the best way to implement that? Note, only one thread will be adding to the Queue of tasks, and its the same one that needs to wait on them to finish.
package jad.util;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ExecutionService {
    public ExecutionService() {
        runnableTasks = new LinkedBlockingQueue<Runnable>(Integer.MAX_VALUE);
        initializeExecutors(Runtime.getRuntime().availableProcessors());
    public ExecutionService(BlockingQueue<Runnable> blockingQueue) {
        runnableTasks = blockingQueue;
        initializeExecutors(Runtime.getRuntime().availableProcessors());
    public ExecutionService(final int NUM_THREADS, final int MAX_JOBS) {
        runnableTasks = new LinkedBlockingQueue<Runnable>(MAX_JOBS);
        initializeExecutors(NUM_THREADS);
    private final void initializeExecutors(final int NUM_THREADS) {
        for (int i = 0; i < NUM_THREADS; i++) {
            createNewExecutor();
            ++numThreadsRunning;
    private final Runnable getPermTask() {
        return new Runnable() {
            @Override
            public void run() {
                Exception ex = null;
                try {
                    while (continueRunning) {
                        getNewTask().run();
                } catch (InterruptedException e) {
                    (ex = e).printStackTrace();
                } catch (Exception e) {
                    (ex = e).printStackTrace();
                } finally {
                    if (ex != null) {
                        createNewExecutor();
    private Executor createNewExecutor() {
        return new Executor(getPermTask());
    private Runnable getNewTask() throws InterruptedException {
        return runnableTasks.take();
    public boolean executeImmediately(Runnable task) throws Exception {
        if (!continueRunning) {
            throw new Exception("ExecutorService instance is shut down");
        return runnableTasks.offer(task);
    public void waitToExecute(Runnable task) throws InterruptedException, Exception {
        if (!continueRunning) {
            throw new Exception("ExecutorService instance is shut down");
        runnableTasks.put(task);
    public void shutDown() {
        continueRunning = false;
        Runnable emptyTask = new Runnable() {
            @Override
            public void run() {
                return;
        for (int i = 0; i < numThreadsRunning; i++) {
            try {
                waitToExecute(emptyTask);
            } catch (InterruptedException e) {
                System.out.println("Could not shut down!");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
    private int numThreadsRunning = 0;
    private volatile boolean continueRunning = true;
    private BlockingQueue<Runnable> runnableTasks;
class Executor {
    public Executor(Runnable task) {
        Thread t = new Thread(task);
        t.setDaemon(true);
        t.setName("Executor service thread");
        t.start();
}Edited by: Jadz_Core on Aug 6, 2009 9:36 PM

You would use a java.util.CountDownLatch if you only wanted to wait for the tasks currently executing and waiting in the queue (for example, there would be no tasks added AFTER the waiting began). I think this is suitable for your situation since you said there would be just one thread adding to the queue.
Pseudocode:
class ExecutorService {
    private volatile CountDownLatch counter = new CountDownLatch(Integer.MAX_VALUE);  //start countdown latch at really high values
    private AtomicInteger activeThreadCount = new AtomicInteger(0); //keep track of threads actually working
    private BlockingQueue queue; //keep waiting tasks
    class PermTask implements Runnable
        public void run()
            while (!shutdown)
                Runnable task = queue.take();
                activeThreadCount.incrementAndGet();
                try
                    taskToRun.run();
                finally
                    activeThreadCount.decrementAndGet();
                    counter.countDown();
    public void waitForTasksToComplete()
        int totalTasks = queue.size() + activeThreadCount.get();
        counter = new CountDownLatch(totalTasks);
        counter.await();
    }This would take a bit of cleaning up, for instance you have to protect the activeThreadCount and the counter so that the values don't change in the middle of some work (a ReadWriteReentrantLock might work nicely here - the PermTask would acquire Read Locks so they don't block each other. The wait... method acquires a Write lock to it waits for Reads to finish, and blocks more Reads until it is done). But it should get you started.
Edited by: stevejluke on Aug 7, 2009 7:01 AM

Similar Messages

  • Application waits for the thread to finish

    Hi all,
    I have a class let say test that extends Thread.
    In my application i say:
    test Xtest = new test();
    Xtest.start();
    System.out.println("Thread finished");
    I need my application to wait for the thread to finish for it to continue, i.e. in my example print "Thread finished" .
    Can someone help me.
    Thanks in advance for your help.
    Best regards,
    Saadi MONLA

    This should work:
    test Xtest = new test();
    Xtest.start();
    Xtest.join();
    System.out.println("Thread finished");

  • Waiting for a thread to finish

    I've been researching this issue for a couple of days, but I dont think I know enough about threading to ask the right question in a search engine. Sorry if this is a basic blunder....I dont write swing often and it shows.
    I have a swing app that includes a long task so I have implemented a progress bar. I need to wait until the progress bar task completes before continuing to the rest of the method. I've tried:
    1. Putting the progress bar within a while loop (while task not complete...) but the progress bar dialog does not render fully. I've even added repaint, but still the dialog looks blank.
    2. SwingUtilities.invokeLater, but it doesnt wait until the progress bar is finished
    3. SwingUtilities.invokeAndWait, though after all the reading I did about deadlock conditions I didnt like the idea. However I was desperate so I tried it and got an error:"Cannot call invokeAndWait from the event dispatcher thread".
    4. Putting the code that needs to occur after the progress bar in an "invokeLater" thread
    5. I've also used the ProgressBarDemo from the java.sun example with the swingworker hoping the worker thread would handle the issue.
    A much smaller version of the code is below:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.Border;
    public class ProblemCode extends JFrame
         private JFrame jFrame = null;
         private JPanel jMain = null;
         private JButton startButton = null;
         public ProblemCode()
              initialize();
         public void initialize()
              //Setup the main application window size
              jFrame = new JFrame();
              jFrame.setContentPane(getJMainPanel());
              jFrame.pack();
              jFrame.addWindowListener(new java.awt.event.WindowAdapter()
                   public void windowClosing(java.awt.event.WindowEvent e)
                        dispose();
              SwingUtilities.invokeLater(new Runnable()
                public void run()
                    jFrame.setVisible(true);
         private JPanel getJMainPanel()
              if(jMain == null)
                   jMain = new JPanel();
                   jMain.add(getJStartButton());
              return jMain;
         private JButton getJStartButton()
              if (startButton == null)
                   startButton = new JButton();
                   startButton.setText("Start");
                   startButton.setVisible(true);
                   startButton.addActionListener(new ActionListener()
                       public void actionPerformed(ActionEvent e)
                           SwingUtilities.invokeLater(new Runnable()
                                 public void run()
                                          progBar();
                            System.out.println("Do this after the progress bar completes");
                            SwingUtilities.invokeLater(new Runnable()
                                 public void run()
                                      System.out.println("invokeLater doesnt work either....");
              return startButton;
         private void progBar()
            JFrame jProgFrame = new JFrame("JProgressBar Sample");
            jProgFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container content = jProgFrame.getContentPane();
            final JProgressBar progressBar = new JProgressBar();
            new Thread()
                private int counter = 0;
                private final int val = (int)(Math.random()*10)+1;
                public void run()
                    for(int i = 0;i <= 100;i++)
                        counter += val;
                        javax.swing.SwingUtilities.invokeLater( new Runnable()
                            public void run()
                                progressBar.setValue(counter);
                        try
                            Thread.sleep(500);
                        catch (InterruptedException e)
            }.start();
            progressBar.setStringPainted(true);
            Border border = BorderFactory.createTitledBorder("Reading...");
            progressBar.setBorder(border);
            content.add(progressBar, BorderLayout.NORTH);
            jProgFrame.setSize(300, 100);
            jProgFrame.setVisible(true);
         public static void main(String[] args)
              SwingUtilities.invokeLater(new Runnable()
                   public void run()
                        new ProblemCode();
    }Thank you for taking the time to review this.

    Hi,
    I made some tiny changes in yoyr code, marked with
    // PBHere the changed code
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.Border;
    public class ProblemCode extends JFrame {
        private JFrame jFrame = null;
        private JPanel jMain = null;
        private JButton startButton = null;
        public ProblemCode() {
         initialize();
        public void initialize() {
         // Setup the main application window size
         jFrame = new JFrame();
         jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // PB
         jFrame.setContentPane(getJMainPanel());
         jFrame.pack();
         jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
             public void windowClosing(java.awt.event.WindowEvent e) {
              dispose();
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
              jFrame.setVisible(true);
        private JPanel getJMainPanel() {
         if (jMain == null) {
             jMain = new JPanel();
             jMain.add(getJStartButton());
         return jMain;
        private JButton getJStartButton() {
         if (startButton == null) {
             startButton = new JButton();
             startButton.setText("Start");
             startButton.setVisible(true);
             startButton.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                       progBar();
                  System.out
                       .println("Do this after the progress bar completes");
                  SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                       System.out
                            .println("invokeLater doesnt work either....");
         return startButton;
        private void progBar() {
         JFrame jProgFrame = new JFrame("JProgressBar Sample");
         jProgFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         Container content = jProgFrame.getContentPane();
         final int val = (int) (Math.random() * 10) + 1; // PB
         final JProgressBar progressBar = new JProgressBar(0, 100 * val); // PB
         progressBar.setStringPainted(true);
         Border border = BorderFactory.createTitledBorder("Reading...");
         progressBar.setBorder(border);
         content.add(progressBar, BorderLayout.NORTH);
         jProgFrame.setSize(300, 100);
         jProgFrame.setVisible(true);
         // PB
         final Thread longTask = new Thread() {
             private int counter = 0;
             public void run() {
              for (int i = 0; i <= 100; i++) {
                  counter += val;
                  javax.swing.SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                       progressBar.setValue(counter);
                  try {
                   Thread.sleep(100); // PB
                  } catch (InterruptedException e) {
         longTask.start();
         // PB
         Thread followUpTask = new Thread(new Runnable() {
             @Override
             public void run() {
              try {
                  System.out.println("Follow up task is waiting");
                  longTask.join();
                  System.out.println("Follow up task  continues");
              } catch (InterruptedException e) {
                  e.printStackTrace();
         followUpTask.start();
        public static void main(String[] args) {
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
              new ProblemCode();
    }Piet

  • Waiting unknown threads to be completed.

    Hi all,
    Here is my issue:
    TaskRunner runner = TaskRunner.getInstance();
    for(Task task : tasks) {
            runner.run(task);
    System.out.println("Done!");Each task may (probably will) create one or more sub-threads... How can I ensure that, by the time I print "Done!", that every task has been completely executed?
    Is there any way to wait for unknown threads to finish before continuing? By unknown, I mean I know absolutely nothing about them (no name, no group...).
    EDIT - I must add I can't touch TaskRunner's code...
    Thank you all in advance!
    Best regards,
    Guilherme
    Edited by: guilherme.tramontina on Aug 16, 2009 8:28 AM
    Edited by: guilherme.tramontina on Aug 16, 2009 8:43 AM

    All,
    ExecutorService didn't work for this specific issue.
    So I solved my problem by doing the following:
    Moved the "for" statement into a new Thread class. Please note the "super()" call... This new Thread is created into a new ThreadGroup.
    public class TaskRunnerThread extends Thread {
         private List<Task> tasks;
         public TaskRunnerThread(List<Task> tasks) {
              super(new ThreadGroup("TRThreadGroup", "TRThread");
              this.tasks = tasks;
         public void run() {
              TaskRunner runner = TaskRunner.getInstance();
              for (Task task : tasks) {
                   runner.run(task);
    }And then...
    TaskRunnerThread trThread = new TaskRunnerTask(tasks);
    trThread.start();
    groupJoin(tsThread.getThreadGroup());
    System.out.println("Done!");Here is the "groupJoin" method:
    private void join(ThreadGroup t) {
         synchronized (t) {
              while (t.activeCount() > 0) {
                   try {
                        t.wait();
                   } catch (InterruptedException e) {
                        e.printStackTrace();
    }It worked like a charm!
    Thanks for your help!
    Best regards,
    Guilherme

  • Wait screen and Thread

    Hi
    I am trying to build a general wait screen like this
    public class Wait extends javax.swing.JFrame {
        private Thread counterThread;
        private String titleWindow;
        public Wait(String title, Thread tr) {
            initComponents();
            this.setTitle(title);
            this.setLocationRelativeTo(null);
            this.setVisible(true);
            counterThread = tr;
            try {
                URL url = new URL("file:///c:/Foronomos/resources/25-0.gif");
                Icon icon = new ImageIcon(url);
                jLabel1.setIcon(icon);
                jLabel1.setText("");
            } catch (Exception ex) {
          counterThread.start();
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        private void initComponents() {
            jLabel1 = new javax.swing.JLabel();
            jLabel2 = new javax.swing.JLabel();
            jButtonCancel = new javax.swing.JButton();
            jButtonStart = new javax.swing.JButton();
        }// </editor-fold>                       
    private void jButtonCancelActionPerformed(java.awt.event.ActionEvent evt) {                                             
        counterThread.interrupt();
        // Variables declaration                     
        private javax.swing.JButton jButtonCancel;
        private javax.swing.JButton jButtonStart;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        // End of variables declaration                  
    }then am display the wait screen from a class creating a new thread
    ShowDocument showDocument = new ShowDocument();
    showDocument.showDocument(id, Main.searchDocuments.getQueryString());
    Thread counterThread = new Thread(showDocument, "showDocument");
    new Wait("Wait...",counterThread);
    ....my problem is that the wait screen delays to displayed on the screen an seems like to wait until the thread is finished
    Am i something missing here?

    TeoDim wrote:
    thanx for reply
    After the code new Wait("Wait...",counterThread);)
    i am not doing nothing.So you are doing something?
    Just if i press a button i want to display a screen with results from a long delay time query. So i want to display at that time a form with a messageFrom where are you execution the long running task? Where is it executing? Are you sure that you aren't using the AWT/Swing thread?

  • Update of jlabel does not happen when i wait for thread to finish (join())

    gurus please help.
    I have a main application which in actionevent calls a thread, that thread calls parent method to update ths status in jlabel, but when i use thread.join() to wait for process to complete, the jlabel does not get updated, please tell me how can i update the jlabel, i have to wait for thread to finish and during run i need to update the jlabel.
    thanks

    hi camickr and gurus:
    here is the code:
    notice after pressing the Process button, the label is being updated but its not working. I called the processnow() method directly and also by thread, but in thread I have to wait until it finishes using join() but still does not work, please help. Thanks
    package label;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.text.*;
    import javax.swing.border.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.event.*;
    public class thePanel extends JDialog {
      private DefaultTableModel tableModel = null;
      private JTable theTable = new JTable();
      private JScrollPane scrollPane = new JScrollPane();
    JPanel tPanel = new JPanel();
      private Border mainBorder;
      private BorderLayout borderLayout1 = new BorderLayout();
      private BorderLayout borderLayout2 = new BorderLayout();
      private BorderLayout borderLayout3 = new BorderLayout();
      private BorderLayout borderLayout4 = new BorderLayout();
      private JPanel statusPanel = new JPanel();
      private JPanel buttonPanel = new JPanel();
      private JPanel lowerPanel = new JPanel();
      private JLabel statusBar = new JLabel();
      private JButton processButton = new JButton("Process");
      public JButton closeButton = new JButton("Close");
      boolean image = true;
      theProcess processThread;
      Vector tableData = new Vector();
      ImageIcon Image = new ImageIcon("image.gif");
      ImageIcon oImage= new ImageIcon("oimage.gif");
      boolean errorOcurred=false;
      String statusMessage;
      public thePanel() {
        try {
         jbInit();
        } catch(Exception e) {
          e.printStackTrace();
      private void jbInit() throws Exception {
        tPanel.setPreferredSize(new Dimension(800,424));
        mainBorder = new TitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)," ");
        statusPanel.setBorder(BorderFactory.createEtchedBorder());
        tPanel.setBorder(mainBorder);
        tPanel.setLayout(borderLayout1);
        scrollPane.getViewport().add(theTable, null);
        tPanel.add(scrollPane,  BorderLayout.CENTER);
        // status
        statusPanel.setLayout(borderLayout2);
        statusPanel.setBorder(BorderFactory.createEmptyBorder());
        statusBar.setAlignmentX((float) 0.5);
        statusBar.setBorder(BorderFactory.createLoweredBevelBorder());
        statusBar.setMaximumSize(new Dimension(600, 21));
        statusBar.setMinimumSize(new Dimension(600, 21));
        statusBar.setPreferredSize(new Dimension(600, 21));
        statusPanel.add(statusBar, BorderLayout.SOUTH);
        // buttons
        processButton.setPreferredSize(new Dimension(70,25));
        processButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            process_actionPerformed(e);
        closeButton.setPreferredSize(new Dimension(70,25));
        buttonPanel.setLayout(borderLayout3);
        buttonPanel.setBorder(BorderFactory.createRaisedBevelBorder());
        buttonPanel.add(processButton,BorderLayout.WEST);
        buttonPanel.add(new JPanel());
        buttonPanel.add(closeButton,BorderLayout.EAST);
        // lower panel
        lowerPanel.setLayout(borderLayout4);
        lowerPanel.setBorder(BorderFactory.createEmptyBorder());
        lowerPanel.add(statusPanel, BorderLayout.WEST);
        lowerPanel.add(buttonPanel, BorderLayout.EAST);
        tPanel.add(lowerPanel, BorderLayout.SOUTH);
        theTable.setAutoCreateColumnsFromModel(true);
        theTable.setColumnSelectionAllowed(false);
        theTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        theTable.getTableHeader().setReorderingAllowed(false);
    getContentPane().add(tPanel);pack();
        getinfo();
    show();
      private void prepairTable(){
        tableModel = new DefaultTableModel(){
                          public boolean isCellEditable(int row, int col)
                            { return false; }};
        tableModel.addColumn("text 1");
        tableModel.addColumn("text 2");
        tableModel.addColumn("text 3");
        tableModel.addColumn("text 4");
        tableModel.addColumn("text 5");
        theTable.setModel(tableModel);
      } // end method (prepairTable)
      public void refreshTable() {
        prepairTable();
      public void getinfo() {
        try {
            refreshTable();
            tableModel.addRow(new Object[]{"3465465555","0123456789",new Date(1135022905196L),"0100000","errror message","sssssss"});
            tableModel.addRow(new Object[]{"8949344562","0324354549",new Date(1134511763683L),"0166600","errror mes666e","ddddddd"});
    setStatusMessage("ready to process, select record and click Process button to process record");
          errorOcurred = false;
        } catch (Exception ex) {
          errorOcurred = true;
          ex.printStackTrace();
        } // End try
      private void process_actionPerformed(ActionEvent e) {
        try {
          if(theTable.getSelectedRows().length > 0) {
    //        processThread = null;
    //        processThread = new theProcess(this);
    //        processThread.start();
    processnow();
            System.out.println("........finished now.........");
          } else {
        } catch (Exception ex) {
          ex.printStackTrace();
      public void processnow() {
        try {
          int[] selectedRows = null;
          int totalSelected = 0;
          setStatusMessage("processing " + totalSelected + " selected records...");Thread.sleep(1500);
          selectedRows = theTable.getSelectedRows();
          totalSelected = selectedRows.length;
          for(int i = 0; i < totalSelected ; i++){
            setStatusMessage("processing " + (i+1) + " of " + totalSelected + " selected records...");
            System.out.println(".......................row: "+selectedRows);
    Thread.sleep(2500);
    System.out.println("........fins...........");
    errorOcurred = false;
    } catch (Exception ex) {
    errorOcurred = true;
    ex.printStackTrace();
    } // End try
    public void setStatusMessage(String message) {
    statusMessage=message;
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    if(image)
    statusBar.setIcon(Image);
    else
    statusBar.setIcon(oImage);
    statusBar.setText(statusMessage);
    statusBar.update(statusBar.getGraphics());
    public static void main(String[] args){
    new thePanel();
    } // class
    package label;
    import java.lang.Runnable;
    public class theProcess implements Runnable {
    private thePanel parent;
    public theProcess(thePanel xparent){
    parent = xparent;
    } // end constructor
    public void start() {
    try {
    Thread thisThread = new Thread(this);
    thisThread.start();
    thisThread.join();
    } catch(Exception ex) {
    ex.printStackTrace();
    } // end method (start)
    public void run(){
    try {
    parent.processnow();
    } catch (Exception ex){
    ex.printStackTrace();
    } // end try
    } // end method (run)
    } // end class

  • Waiting the main thread till all child thread has completed

    I am in the process of developing a batch application in Java 5.0 which extensively uses the java.util.concurrency API. Here is a small description of what the batch process will do,
    1. Retrieve values from DB and populate a blocking queue in main thread.
    2. Instantiate a Threadpool by calling, Executors.newFixedThreadPool(2)
    3. Invoking the following block of code from the main thread,
    while(!iBlockingQueue.isEmpty()) {
        AbstractProcessor lProcessor = new  DefaultProcessor((BusinessObject)iBlockingQueue.remove());
        iThreadPool.execute(lProcessor);
    }DefaultProcessor is a class that extends Thread.
    4. Invoking the following block of code from the main thread,
    iThreadPool.shutdown();
    try {
         iThreadPool.awaitTermination(30, TimeUnit.SECONDS);
         } catch (InterruptedException interruptedException) {
              iLogger.debug("Error in await termination...", interruptedException);
    Since, this is the first time I am using the java.util.concurrency API, I want to know whether this is the right way to wait for all the child threads to complete before executing further statements in the main (parent) thread. Or do I necessariliy have to call join() to ensure that the main thread waits for all the child threads to finish which can only happen when the queue is empty.
    Please note here that as per the requirements of the application the blocking queue is filled only once at the very beginning.
    I will appreciate any inputs on this.
    Thanks.

    looks like you would be waiting on a queue twice, once in the loop and again, under the hood, in the threadpool's execute()
    the threadpool's internal queue is all that is needed
    if your iBlockingQueue is also the threadpool's internal queue, you might have a problem when you remove() the BusinessObject
    by making DefaultProcessor extend Thread you are, in effect, implementing your own threadpool without the pooling
    DefaultProcessor need only implement Runnable, it will be wrapped in a thread within the pool and start() called
    to implement a clean shutdown, I suggest writing DefaultProcessor.run() as an infinite loop around the blocking queue poll(timeout) and a stop flag that is checked before going back to poll
    class DefaultProcessor implements Runnable {
      private BlockingQueue myQ;
      private boolean myStopFlag;
      DefaultProcessor( BlockingQueue bq ) { myQ = bq; }
      public void run() {
        BusinessObject bo = null;
        while( !myStopFlag && (bo=myQ.poll( 10, SECONDS )) ) {
          // business code here
      public void stop() { myStopFlag = true; }
    } Now, after iThreadPool.shutdown(), either call stop() on all DefaultProcessors (or alternatively send "poison" messages to the queue), and give yourself enough time to allow processing to finish.

  • Waiting for a thread to die.

    Hello, I hope you can help me...
    I am writting a jdk1.4.1 Swing application that displays a small animation. This animation is processed from within a separate thread. My program makes a call starting this 'animation thread'. For practical reasons my program needs to wait for this thread to die (and thus the full animation to be shown) before it can continue. I am waiting for the animation thread to die using Threads 'join' method. However the problem with this is that I am forcing the GUI thread to wait resulting in the animation being calculated but not displayed. And so... how can I fix this... all I want is to wait until the animation is shown.
    What I would like to do is:
    1. Start animation;
    2. wait intil animation has completed;
    3. continue with program.
    Any help or advice will be greatly appreciated.
    Thank you in advance.

    Maybe this design could work for you. You divide your program into three parts running in three separate threads.
    1. The main thread handling GUI stuff and coordination of the two other threads.
    2. A working thread doing most of what the main thread is now doing.
    3. The animation thread.
    With this division of labour the working thread is waiting for the animation thread to finish (the main GUI thread isn't). The main thread will be free at all times to react to the users input or updating the screen or whatever, while the other two threads are cooperating to produce the animation.

  • How to use Wait Screen and Thread?

    Greetings,
    I was wondering If I could ask a question...
    Here it goes:
    How can I use a Wait Screen in a MIDlet so that I can do the Following:
    1.- Create and Open an Http Connection[b[i]](using an Object which extends Thread) in a Form by pressing an OKCommand.
    2 .- Show the Wait Screen Until the Thread Object finishes execution(finishes whatever is inside run() method)
    3.- Finally show the Result(s) of the Connection(bytes obtained from URL) in another Form.
    First of all, Is what I ask even possible? and more importantly...
    Can a Wait Screen actually Detect when a Thread finished execution? so that only when the thread finishes the program proceeds to the next statement?
    Thank you very much in advance!
    Sincerely, your friend,
    Jose

    Thank you very much Sir, I suppose that narrows it down a bit,
    Because I definitely need my applications as standard as possible.
    But good to know there's a way to do it.
    Well, Thank you very much as usual!
    Sincerely,
    Keep up with the fantastic job you do every day!
    God Bless.
    J

  • How to find out if a thread has finished execution?

    Hi, Am new to multi-threaded programming. I have a question: I start a new thread from the main thread. This new thread has to update a swing component & thats it. How do I know when the new thread has finished its execution? Also, I need to kill the thread once it finishes its execution?..or will Java's GC take care of it? If I need to kill it from the code, how do I do it? I see that the destry() method of Thread class is deprecated.
    Thanks.

    boolean isAlive()
    Also, I need to kill the thread once it finishes its execution?..No
    or will Java's GC take care of it? Yes
    You can do Thread.join.
    See the API docs and/or a threads primer.

  • Thread: How to tell when the thread is finished AND how to kill it?

    Hi there,
    I have a thread that runs in the background and does this:
    class MyThread implements Runnable 
              public void run()
                   Stopper stopper = new Stopper();
                            //do something that takes some time
                            stopper.stop();
                            System.out.println("total time "+stopper.getTime());
    }this works fine (I have a swing gui where I click a button and this thread runs and it's ok. PROBLEM IS, when I click the button again (to re-activate the thread) it seems that the stopper is not null but still counting the time (I was under the impression that ...= new Stopper() will create a new object type Stopper).
    so -
    1. How can I tell when thread is finished?
    2. How do I kill this thread once it is finished?
    the invocation:
         public void actionPerformed(ActionEvent arg0)
              Thread t = new Thread( new MyThread());
              t.start();          
         }THANK YOU!

    You have not posted to code for Stopper, so it's impossible to reason about that
    1. How can I tell when thread is finished?
    Use Thread.Join() or Thread.isAlive()
    2. How do I kill this thread once it is finished?
    You can't and you don't. Just let the method the thread is running exit normally. Sometimes that means putting in a boolean variable to control a loop, and then exiting when the boolean is false.
    Another thought - you could set the thread as a Daemon thread - when you don't have any non-daemon threads running, java will exit.

  • When server start, get "Waiting for another script to finish..." message and doesn't go anywhere.

    Hello, my engineer (Japanese) is trying to start AdobeMediaServer but he got stuck after getting "Waiting for another script to finish..." message. Any idea how to resolve this situation?
    [root@NA1SIBZDH02 /opt/adobe/ams]# ./server start
    NPTL 2.5
    chmod: changing permissions of `./tmp/': 読み込み専用ファイルシステムです
    Waiting for another script to finish...
    [root@NA1SIBZDH02 /opt/adobe/ams]#
    [root@NA1SIBZDH02 /opt/adobe/ams]#
    [root@NA1SIBZDH02 /opt/adobe/ams]# ls -l
    合計 52324
    drwxr-xr-x 15 ams  ams      4096  9月 11 17:54 Apache2.2
    -rwxr-xr-x  1 root root  1061035  9月 11 17:54 License.htm
    -rwxr-xr-x  1 root root    43374  9月 11 17:54 License.txt
    -rwxr-xr-x  1 root root    58827  9月 11 17:54 ReleaseNotes.htm
    -rwxr-xr-x  1 root root     5715  9月 11 17:54 adminserver
    -rwxr-xr-x  1 root root      871  9月 11 17:54 adobe-lq.png
    -rwxr-xr-x  1 root root     2912  9月 11 17:54 ams_icon.png
    -rwxr-xr-x  1 root root  3220552  9月 11 17:54 amsadmin
    -rw-r--r--  1 root root        6  9月 11 17:54 amsadmin.pid
    -rwxr-xr-x  1 root root 11187664  9月 11 17:54 amscore
    -rwxr-xr-x  1 root root  4331472  9月 11 17:54 amsedge
    -rwxr-xr-x  1 root root  3070840  9月 11 17:54 amsmaster
    -rw-r--r--  1 root root        6  9月 11 17:54 amsmaster.pid
    -rwxr-xr-x  1 root root     5242  9月 11 17:54 amsmgr
    drwxrwxrwx  6 ams  ams      4096  9月 11 17:54 applications
    -rwxr-xr-x  1 root root      960  9月 11 17:54 cleanup
    drwxr-x---  3 ams  ams      4096  9月 11 17:54 conf
    drwxr-xr-x  5 ams  ams      4096  9月 11 17:54 creds
    drwxr-xr-x  3 root root     4096  9月 11 17:54 documentation
    -rwxr-xr-x  1 root root 16368842  9月 11 17:54 libadbe_dme.so
    -rwxr-xr-x  1 root root   336065  9月 11 17:54 libadbe_flv.so
    -rwxr-xr-x  1 root root    59248  9月 11 17:54 libasneu.so.1
    -rwxr-xr-x  1 root root    71263  9月 11 17:54 libcares.so
    -rwxr-xr-x  1 root root    71263  9月 11 17:54 libcares.so.2
    -rwxr-xr-x  1 root root    71263  9月 11 17:54 libcares.so.2.0.0
    -rwxr-xr-x  1 root root  1968482  9月 11 17:54 libcrypto.so.1.0.0
    -rwxr-xr-x  1 root root   162403  9月 11 17:54 libexpat.so.1
    -rwxr-xr-x  1 root root  3497472  9月 11 17:54 libfmsccme.so
    -rwxr-xr-x  1 root root  6992879  9月 11 17:54 libhds.so
    -rwxr-xr-x  1 root root   403767  9月 11 17:54 libssl.so.1.0.0
    drwxr-xr-x  2 root root     4096  9月 11 17:54 licenses
    drwxrwxrwx  2 root root     4096  9月 11 17:54 logs
    drwxr-xr-x  5 root root     4096  9月 11 17:54 modules
    drwxr-xr-x  6 root root     4096  9月 11 17:54 samples
    drwxr-xr-x  3 root root     4096  9月 11 17:54 scriptlib
    -rwxr-xr-x  1 root root     7494  9月 11 17:54 server
    -rwxr-xr-x  1 root root   300864  9月 11 17:54 shmrd
    -rwxr-xr-x  1 root root    36206  9月 11 17:54 tcSrvMsg
    drwxrwxrwx  2 root root     4096  9月 11 17:54 tmp
    drwxr-xr-x  9 root root     4096  9月 11 17:54 tools
    -rwxr-xr-x  1 root root     2411  9月 11 17:54 uninstallAMS
    drwxr-xr-x  8 ams  ams      4096  9月 11 17:54 webroot
    [root@NA1SIBZDH02 /opt/adobe/ams]#
    [root@NA1SIBZDH02 /opt/adobe/ams]#
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    A possible cause is security software (firewall) that blocks or restricts Firefox or the plugin-container process without informing you, possibly after detecting changes (update) to the Firefox program.<br />
    Remove all rules for Firefox from the permissions list in the firewall and let your firewall ask again for permission to get full unrestricted access to internet for Firefox and the plugin-container process and the updater process.
    See:
    * https://support.mozilla.com/kb/Server+not+found
    * https://support.mozilla.com/kb/Firewalls

  • Waiting for another script to finish...

    I can no more start or stop FMS3 server, it says :
    Waiting for another script to finish...
    According to the start script, i check
    /home/fms/tmp/script.lck and i have this file as empty, what should
    i do then ?
    Do you all have this file ? /home/fms/tmp/script.lck ?
    Jerome

    My reply is late i just read your problem after having the same, it locked up my whole Ubuntu system.
    Its easy to solve just delete the lock folder you see. Server should restart and work fine.

  • [JRockit] WARNING: could not open Unknown thread system flavour for reading

    [JRockit] WARNING: could not open Unknown thread system flavour for reading, per-thread CPU usage can't be measured.
    What are the reason of this warning?
    Can I ignore this warning?
    My system is: SLES9 SP3
    (2.6.5-7.276.PTF.196309.1-bigsmp)
    Pagesize = 1 075 080 972

    Which version of JRockit (java -version) ? Do you have LD_ASSUME_KERNEL set?
    /Staffan

  • Compressor 4.1.3 hangs Waiting for Create Disc to Finish

    Compressor 4.1.3 hangs at the "Waiting for Create Disc to Finish" stage.  The audio and video streams have been created and are in Finder. The correct drive has been selected in the Actions section and there is a disk in the drive. I have run Compressor Repair.  However there is no activity at the drive (which otherwise works fine and will burn a disk from Finder).  Anyone any ideas?

    I'e not run into this before. Try a different clip – preferably a QuickTime movie. Bring that into Compressor and mark a short section with in and out points. Choose Hard Drive for Output Device in the Job Action section. What happens after you submit it?
    Russ

Maybe you are looking for

  • Regarding select option in a module pool prog .

    hello .. i need some help regarding select options in a module pool program .. i hav tried putting a select options in a module pool prog but i am not able 2 ... can any one tel me why select options r not aloowed in a module pool prog ?? and i read

  • Decimal places not allowed

    Hello, We have created one materail , their Base unit of measure is "BOX" Checked the CUNI transaction, in that Decimal places  field is "0' and Decimal place rounding filed "0" With reff to this material while creation of Purchase order system will

  • Barcode Separators for Acrobat Pro X

    I'm trying to determine if Acrobat can produce its own barcodes for separator pages.  Do I have to create my own barcodes in Forms or must I buy further software?  I've got a small desk scanner and it doesn't look like my hardware (Kodak i2800) has i

  • Error: Deleted Tunes from Folder and Substitution of Old Tunes!

    I surf Itunes evaluating songs I am considering buying. When I find one, I transfer the 30-second clip to a folder designated TOP TUNES. At the end of the week, I listen to the collection and make purchases. Two days ago, I opened Itunes and saw an e

  • How to utilize max use of DEBUG?

    HI Expert's, Guru's and Sifu's As an abaper, i would like explore more on Debug. My questions are:- 1)  What is the use of "desktop 3" ? 2)   The use of break and watch point? 3)  the use of Abap Stack? 4) the function of Variable 1, Variable 2, Loca