Java: многопоточность -Wait / notifyAll Вопрос - PullRequest
5 голосов
/ 09 июня 2011

У меня есть класс, который порождает кучу потоков и должен ждать, пока все порожденные потоки не будут завершены. (Мне нужно рассчитать время завершения всех потоков).

MainClass порождает все потоки, а затем проверяет, все ли потоки завершены, прежде чем он сможет вызвать себя завершенным.

Будет ли эта логика работать. Если так, есть ли лучший способ сделать это? Если нет, я бы хотел лучше понять этот сценарий.

class MainClass{
    private boolean isCompleted;
    ...
    for(task : tasks){
        threadpool.execute(task);
    }

    for(task : tasks){
        if(!task.isCompleted()){
            task.wait()
        }
    }

    isCompleted = true;
}


class Task{
    public void run(){
        ....
        ....
        synchronized(this){
            task.completed = true;
            notifyAll();
        }
    }
}

Ответы [ 3 ]

11 голосов
/ 09 июня 2011

notifyAll() относительно медленно. Лучше использовать CountDownLatch:

import java.util.concurrent.CountDownLatch;

int n = 10;
CountDownLatch doneSignal = new CountDownLatch(n);
// ... start threads ...
doneSignal.await();

// and within each thread:
doWork();
doneSignal.countDown();
4 голосов
/ 10 июня 2011

Все это может быть сделано с помощью java.util.concurrent.ExecutorService.

class MainClass {
    ...
    ExecutorService executor = Executors.newCachedThreadPool();
    List<Callable> tasks = ...; // prepare your tasks

    // this invokes all tasks in parallel and waits until all are done
    executor.invokeAll(tasks);
    ...
}

Вот и все.

4 голосов
/ 09 июня 2011

В этом случае нет необходимости ждать / уведомлять.Вы можете просто перебрать темы и вызвать join().Если поток уже завершен, поток MainClass просто будет ждать следующего.

Возможно, вы захотите взглянуть и на утилиты более высокого уровня в пакете java.util.concurrent.

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