4 Replies Latest reply on Feb 26, 2008 10:32 PM by kirillcool

    Maximum number of SwingWorker objects in a Swing app?

    843806
      I'm wondering whether there is a limit on the number of SwingWorker objects you can have simultaneously running in a single Swing application?

      While developing a program which will use quite a number of different SwingWorkers (> 50) I noticed that no more than approx. 10 SwingWorker objects get executed at once. More SwingWorkers keep pending somewhere in a queue and are only executed if others are finished or get cancelled/interrupted.

      Any idea?
        • 1. Re: Maximum number of SwingWorker objects in a Swing app?
          800382
          If you have 1 CPU (or 1 core) (and if multiple, I guess it depends on the Java installation), then you only have 1 running at a time. Same as any other multi-threading things you do.

          I'm not sure if multiple SwingWorkers create their own threads (I would assume so), but regardless, there can only be so many threads that can be perceived as running at the same time (even though they may not be). And one thread can only do 1 thing at a time.

          Sounds like you're app's biting off more than it can chew.
          • 2. Re: Maximum number of SwingWorker objects in a Swing app?
            843806
            Perhaps I did not properly describe my question. As an example, take the following small program:
            import java.text.SimpleDateFormat;
            import java.util.Date;
            import javax.swing.SwingWorker;
            
            public class SwingWorkerTest
            {
              public static void main(String[] args)
              {
                for (int i = 1; i <= 30; i++)
                {
                  new Worker(i).execute();
                }
              }
            }
            
            class Worker extends SwingWorker
            {
              private int id;
              
              public Worker(int id)
              {
                this.id = id;
              }
              
              @Override
              protected Object doInBackground()
              {
                System.out.println(new SimpleDateFormat("HH-mm-ss:").format(new Date(System.currentTimeMillis())) + 
                    " started worker no." + id);
                try
                {
                  Thread.sleep(5000);         // Do nothing for 5 seconds
                }
                catch (InterruptedException e)
                {
                  ;
                }
                return null;
              }
              
            }
            This program produces following output:
            20-42-01: started worker no.10
            20-42-01: started worker no.9
            20-42-01: started worker no.5
            20-42-01: started worker no.3
            20-42-01: started worker no.6
            20-42-01: started worker no.7
            20-42-01: started worker no.2
            20-42-01: started worker no.1
            20-42-01: started worker no.8
            20-42-01: started worker no.4
            20-42-06: started worker no.12
            20-42-06: started worker no.11
            20-42-06: started worker no.13
            20-42-06: started worker no.14
            20-42-06: started worker no.15
            20-42-06: started worker no.16
            20-42-06: started worker no.17
            20-42-06: started worker no.18
            20-42-06: started worker no.19
            20-42-06: started worker no.20
            20-42-11: started worker no.21
            20-42-11: started worker no.22
            20-42-11: started worker no.23
            20-42-11: started worker no.24
            20-42-11: started worker no.25
            20-42-11: started worker no.26
            20-42-11: started worker no.27
            20-42-11: started worker no.28
            20-42-11: started worker no.29
            20-42-11: started worker no.30
            As can be seen, a total of 30 (Swing)Workers are created and executed. However, only the first 10 are started immediately (at 20-42-01), and after 5 seconds when they have terminated the next 10 Workers are started (at 20-42-06), and the same goes for the third bunch of Workers.

            So, obviously only ten SwingWorkers are executed simultaneously at any given time. I couldn't find anything about this restriction in the javadocs.

            Anyone here with more insight? ;-)
            • 3. Re: Maximum number of SwingWorker objects in a Swing app?
              843806
              I came to the conclusion that my program needs some redesign since using so many threads (via SwingWorkers) is not a good idea anyway. I think I will be able to manage with two or three SwingWorkers in the end.

              However, I'd still be interested to know whether there is an intentional restriction on the number of concurrently running SwingWorkers?
              • 4. Re: Maximum number of SwingWorker objects in a Swing app?
                kirillcool
                And all it would take is for you to look at the source code of SwingWorker and see how many worker threads are created.