Как ждать несколько предметов - PullRequest
2 голосов
/ 28 марта 2011

У меня есть поток, который должен ждать несколько объектов из разных потоков.

@Override
public void run() {
    while (true) {
        for (BackgroundTask task : tasks) {
            synchronized (task) {
                if (task.isReady()) {
                    task.doTask();
                }
            }
        }
    }
}

Но это глупое использование процессорного времени. Как ждать несколько предметов?

Ответы [ 4 ]

3 голосов
/ 28 марта 2011

IMO CountDownLatch было бы хорошим способом добиться этого.Цитата из Javadoc:

 class Driver2 { // ...
   void main() throws InterruptedException {
     CountDownLatch doneSignal = new CountDownLatch(N);
     Executor e = ...

     for (int i = 0; i < N; ++i) // create and start threads
       e.execute(new WorkerRunnable(doneSignal, i));

     doneSignal.await();           // wait for all to finish
   }
 }

 class WorkerRunnable implements Runnable {
   private final CountDownLatch doneSignal;
   private final int i;
   WorkerRunnable(CountDownLatch doneSignal, int i) {
      this.doneSignal = doneSignal;
      this.i = i;
   }
   public void run() {
      try {
        doWork(i);
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }
1 голос
/ 28 марта 2011

Если вы можете изменить класс BackgroundTask, пусть он уведомит вашего бегуна, когда он будет готов. Добавьте очередь в свой класс бегуна, и каждый раз, когда задача готова, она может добавить себя в очередь и уведомить об этом.

Затем класс бегуна ждет в очереди, когда она пуста, и вытаскивает из нее элементы для запуска, когда она не запущена.

1 голос
/ 28 марта 2011

Пожалуйста, используйте notifyaAll() вместо notify(), потому что notify активирует один поток, а notifyAll () активирует все ожидающие потоки.

0 голосов
/ 28 марта 2011

Вы можете использовать notify() и wait() на Объекте . Как вы используете его, зависит от вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...