@Async предотвращает продолжение потока до завершения другого потока

У меня есть приложение, в котором определенное количество раз нужно что-то вычислить. Эта функция расчета имеет аннотацию @Async (из Spring Framework), что позволяет выполнять эти вычисления в 4 потоках. Проблема в том, что мне нужно около 40000 таких вычислений, и я хочу знать время между началом и концом всех вычислений, поэтому я вижу, сколько времени до и после цикла for, вызывающего функции вычисления. Но теперь все вычисления помещены в очередь, поэтому цикл for завершается немедленно, и время составляет примерно 1 секунду, в то время как для завершения вычислений требуется пара часов. Я пробовал установить максимальный размер очереди около 100 (также хорошо для уменьшения использования памяти), но это тоже не решение, так как я пропущу последние 100 вычислений за общее время, которое требуется. Есть ли способ приостановить выполнение кода сразу после цикла for до тех пор, пока все потоки не закончат свою работу, но все еще смогут использовать аннотацию @Async?

Это некоторый код, который иллюстрирует ту же проблему:

Выполняющий класс:

public class Foo {
    public void executeBlaALotOfTimes() {
        long before = System.currentTimeMillis();

        for (int i = 0; i<40000; i++) {
            executeBla();
        }

        long after = System.currentTimeMillis(); 

        System.out.println("Time it took for a lot of bla to execute: " + (after - before) / 1000.0 + " seconds.");
    }
}

И класс, который выполняет вычисления:

@Service
public class Bar {
    @Async
    public void executeBla() {
        System.out.println("Bla!");
    }
}

Это приведет к следующему результату (при условии, что код в Foo выполняется бесконечно быстро):

Time it took for a lot of bla to execute: 0.0 seconds.
Bla!
Bla!
Bla!
Bla!
.
.
.
etc
10
задан FinalArt2005 1 December 2010 в 12:32
поделиться