Существует ли верхний предел количества потоков 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.