Рассмотрим следующий код:Выполняет ли ExecutorService внутри SwingWorker хорошую практику?
SwingWorker<Void, Void> sworker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
for (int j = 0; j < 5; j++) {
Callable<Object> worker = new MyCallableImpl();
Future<Object> future = executor.submit(worker);
array[j] = future.get();
}
} catch (InterruptedException e) {
// some code here
} catch (ExecutionException e) {
// some code here
}
// some code here
executor.shutdown();
return null;
}
};
sworker.execute();
Как я уже говорил в названии: это хорошая практика, чтобы вызвать ExecutorService внутри doInBackground метода() из SwingWorker? Это работает для меня (JDK1.7), GUI не заблокирован, и несколько потоков из пула Исполнителей работают в фоновом режиме, но все же у меня есть некоторые сомнения ...
Да, я знаю это, но я хочу запустить несколько потоков (Callables) внутри SwingWorker. Как я могу сделать это без ненужной упаковки Executor внутри SwingWorker? – DoktorNo
Тогда я просто избавился бы от «SwingWorker». Если какая-либо из этих задач изменит компонент Swing, заверните вызов, используя 'SwingUtilities.invokeLater' – mre
Да, они изменяют компоненты Swing (код не отображается, чтобы избежать путаницы). Я попробую ваше решение тем временем. – DoktorNo