Какое максимальное количество потоков рабочих качаний может быть запущено

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

Ответ 1

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 экземпляров, они должны будут стоять в очереди и ждать, пока поток из пула станет доступным.

Ответ 2

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. Конечно, это доступ к некоторому классу backdoor sun.awt.AppContext, но это быстрый способ обхода тех, кто заинтересован, и не способен/не хочет предоставлять свой собственный ExecutorService.