Для дальнейшего ответа мрэ.Это не имеет смысла, потому что ваше выполнение на самом деле является однопоточным.doInBackground
отправит исполнителю и дождется завершения одной задачи, затем отправит другую.
Вы должны отправить тот же способ, но сохранить возвращенные Future
s в каком-либо Списке, а затем войти в каждое из них после того, как все задачи были отправлены.
Я неdoInBackground
должен представить эти задания асинхронно, как и mre.Если вы пытаетесь отправить несколько заданий и в каждый момент времени отправляете только N, вам определенно не следует делать это через SwingWorker.doInBackground
.Использование ExectorService + SwingUtilities.invokeLater
Я думаю, что это лучший способ.
И просто для выяснения любой путаницы, invokeLater
следует использовать здесь только тогда, когда задача в ExecutorService завершена и все, что нужно сделать, это обновить компонент пользовательского интерфейса.
Редактировать: Примерчтобы ответить на ваш комментарий
protected Void doInBackground() throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future> futures = ...;
try {
for (int j = 0; j < 5; j++) {
Callable<Object> worker = new MyCallableImpl();
futures.add(executor.submit(new Callable<Object>(){
public Object call(){
//expensive time consuming operation
final String result = ...;//result from consuming operation
SwingUtilities.invokeLater(new Runnable(){
public void run(){
jLabel.setText(result);
}
});
return new Object();
}
));
}
for(Future<Object> f :futures)f.get();
executor.shutdown();
return null;
}
Обратите внимание, как invokeLater
делается для простого обновления?Это не должно вызывать зависание вашего EDT.