Java пауза во время цикла - PullRequest
2 голосов
/ 10 января 2012

Я запускаю цикл for и на каждой итерации выполняю SwingWorker в фоновом режиме (который длится около 5 минут).У меня есть атрибут, который является числом рабочих, работающих в фоновом режиме одновременно.

Цикл for имеет 100 итераций, но я хочу, чтобы только 5 одновременно работающих SwingWorker работали.Как я могу приостановить итерацию цикла, если число одновременно работающих рабочих превышает 5?как я могу возобновить его, когда оно станет ниже?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 января 2012

Обычно я использую ExecutionService с 5 потоками, чтобы сделать это. Но вы можете использовать Семафор вот так.

 final Semaphore permits = new Semaphore(5);
 for(int i=0;i<100;i++) {
     permits.acquire();
     // add a task
 }



 // in the SwingWorker
 public String doInBackground() {
     try {
        return findTheMeaningOfLife();
     } finally {
        permits.release();
     }
 }
1 голос
/ 10 января 2012

Посетите следующий блог о регулировании и мониторинге SwingWorker.В нем объясняется, как определить число одновременных потоков M для выполнения N задач.

В основном вам придется создать пул потоков и позволить ему управлять выполнением ваших рабочих.http://blogs.oracle.com/swinger/entry/swingworker_throttling_and_monitoring

0 голосов
/ 10 января 2012

Предполагая, что цикл for не выполняет ничего, кроме выполнения ваших SwingWorkers, один из способов сделать это - просто отправить 100 задач в ThreadPoolExecutor с размером пула, установленным на 5.

...