Я создаю SwingWorkers на основе ряда соединений, которые мне нужно сделать. Я пытаюсь сделать так, чтобы установить фиксированное число максимально совпадающих SwingWorkers и когда один из них заканчивается, другой запускается (или многие другие запускаются, если многие закончили). На основе http://java.dzone.com/articles/multi-threading-java-swing Я настраиваю основной SwingWorker так:
Как правильно использовать ExecutorService для управления числом одновременно работающих SwingWorkers?
SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
System.out.println("One SwingWorker just ran! ");
}
return true;
}
// Can safely update the GUI from this method.
protected void done() {
boolean status;
try {
// Retrieve the return value of doInBackground.
status = get();
statusLabel.setText("Completed with status: " + status);
} catch (InterruptedException e) {
// This is thrown if the thread's interrupted.
} catch (ExecutionException e) {
// This is thrown if we throw an exception
// from doInBackground.
}
}
};
worker.execute();
Теперь я неуверенный в том, как реализовать механизм, который я описал выше.
Из https://stackoverflow.com/a/8356896/988591 я увидел, что я могу использовать ExecutorService выполнять экземпляры SwingWorker и что этот интерфейс также позволяет установить количество потоков:
int n = 20; // Maximum number of threads
ExecutorService threadPool = Executors.newFixedThreadPool(n);
SwingWorker w; //don*t forget to initialize
threadPool.submit(w);
Я думаю, что это то, что мне нужно, но я дон Не знаю, как собрать все это вместе (.. Я тоже совершенно новичок в Java ..). Может ли кто-нибудь мне немного помочь в этом? Скажем, что у меня есть int totalTask = 100;
Возможно, это всего лишь вопрос некоторых циклов, но я не могу найти каких-либо действительно простых примеров, и я просто не могу полностью обдумать его, но так .. Я бы оцените некоторую помощь! Благодарю.
UPDATE: Я настроил ExecutorService таким образом:
ExecutorService executorService = Executors.newFixedThreadPool(500);
for (int i = 0; i < 20 ; i++) {
executorService.submit(worker);
//I tried both...
//executorService.execute(worker);
}
и я удалил worker.execute()
названный после SwingWorker выше, но выход из консоли только один " Один SwingWorker просто побежал! " линия, как это? Что я сделал не так?
, как я заметил в предыдущем вопросе, тщательно с количеством экземпляров SwingWorkers, которые выполняются с уверенностью, SwingWorker инициализируется из Будущего, и ничто не гарантирует, что все экземпляры завершены в одно и то же время или будет запущен другой экземпляр (действителен для логики с Thread тоже , но без ошибок), логики с Runnable # Thead лучше, проще и удобнее, get() in done() использовать для catch для возможного исключения, а не для возвратов – mKorbel
Меня не интересует порядок, который они заканчивают в этом дело. Не уверен, что вы имеете в виду, «но без ошибок». Во всей документации, которую я прочитал для SwingWorker done() и get(), они используются соответственно для вызова метода обратного вызова, который 1) может получить доступ к возвращаемому значению SwingWorker doInBackground() и 2), может безопасно обновлять GUI (поскольку он автоматически запущен в EDT). Я не уверен, ссылаетесь ли вы на другие методы get() и done(), и я не знаю, если они также используются в Runnable # Thread. –
1. вы можете [get() исключить или вернуть] (http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker-if-threa) 2. публиковать ()/setProcess – mKorbel