Каково максимальное количество рабочих потоков Swing, которые могут быть запущены - PullRequest
10 голосов
/ 02 декабря 2011

Существует ли верхний предел числа потоков Swing Worker, которые могут быть запущены, или это похоже на то, насколько поддерживает память?И это где-нибудь настраивается?

Ответы [ 2 ]

13 голосов
/ 02 декабря 2011

A SwingWorker не сам поток, а задача, которая будет выполняться в потоке. Обычно вы используете ExecutorService для выполнения экземпляров SwingWorker; этот интерфейс также позволяет установить количество потоков:

 int n = 20; // Maximum number of threads
 ExecutorService threadPool = Executors.newFixedThreadPool(n);
 SwingWorker w; //don't forget to initialize
 threadPool.submit(w);

Теперь, если вы отправите более n SwingWorker экземпляров, им придется стоять в очереди и ждать, пока поток из пула не станет доступным.

3 голосов
/ 28 ноября 2013
final int corePoolSize = 100;
final int maximumPoolSize = 100;
final long keepAliveTime = 100000;
final TimeUnit unit = TimeUnit.SECONDS;
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize);
sun.awt.AppContext.getAppContext().put(SwingWorker.class,
                 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue));

Приведенный выше пример кода позволит вам выполнить число SwingWorkers больше, чем по умолчанию.Конечно, он обращается к некоторому закулисному классу sun.awt.AppContext, но это быстрый обходной путь для тех, кто заинтересован и не может / не хочет предоставить свой собственный ExecutorService.

...