Потоки и заставка - PullRequest
       7

Потоки и заставка

0 голосов
/ 20 мая 2011

У меня есть приложение, которое полагается на создание определенных объектов из N файлов, прежде чем GUI должен быть представлен пользователю. Я решил создать заставку и хочу показать индикатор выполнения, показывающий, как далеко продвинулось приложение с его начальными задачами.

Я только начал изучать API java.util.concurrent и думаю решить эту проблему, используя CountDownLatch и FutureTask: создайте FutureTask для каждого из файлов, которые необходимо прочитать, и получите построенные объекты; используйте CountDownLatch, чтобы гарантировать, что GUI не представлен до тех пор, пока не будут выполнены предварительные задачи, и зарегистрировать, как далеко мы продвинулись в этом процессе (выполнив запрос getCount () и перерисовать строку состояния над изображением заставки.

Это перебор?

Ответы [ 2 ]

1 голос
/ 20 мая 2011

a семафор лучше, поскольку вы можете разрешить повторное использование потоков задач во время запуска

создайте семафор с помощью s = new Semaphore(-nbFiles+1), и каждая задача будет вызывать s.release (), когда они будут выполнены с файлом

Заставка может знать, как далеко все продвигается с помощью nbFiles + s.availablePermits ()

0 голосов
/ 20 мая 2011

Я бы создал 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..
}

Обратите внимание, что код не проверен и может не скомпилироваться, но он иллюстрирует, что вы хотите сделать.

...