Я бы создал CountDownLatch , который инициализируется количеством задач, которые вам нужно выполнить, прежде чем вы сможете отобразить пользовательский интерфейс.
Я бы тогда использовал, например, фиксированный пул потоков , в который я публикую задачи, подобные:
public class Task implements Runnable {
CountDownLatch latch;
public Task(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
//First perform some business logic... then
latch.countDown();
}
}
Поток мониторинга (обратите внимание, это не должно выполняться потоком пользовательского интерфейса) должен сделать что-то вроде этого:
public void monitorProgress(final CountDownLatch latch) {
while (latch.await(5, TimeUnit.SECONDS) == false) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// update the progress, latch.getCount() tasks are remaining
}
});
}
//Execution has been completed once you reach this line..
}
Обратите внимание, что код не проверен и может не скомпилироваться, но он иллюстрирует, что вы хотите сделать.