Каков самый простой способ дождаться завершения всех задач ExecutorService? Моя задача в первую очередь вычисляется, поэтому я просто хочу запустить большое количество заданий - по одному на каждое ядро. Сейчас моя настройка выглядит так:
ExecutorService es = Executors.newFixedThreadPool(2);
for (DataTable singleTable : uniquePhrases) {   
    es.execute(new ComputeDTask(singleTable));
}
try{
    es.wait();
} 
catch (InterruptedException e){
    e.printStackTrace();
}
 ComputeDTask реализует runnable. Кажется, что выполнение задач выполняется правильно, но код падает на wait() с помощью IllegalMonitorStateException. Это странно, потому что я играл с некоторыми примерами игрушек и, похоже, работал.
 uniquePhrases содержит несколько десятков тысяч элементов. Должен ли я использовать другой метод? Я ищу что-то как можно проще
