我有一个应用程序,在某些情况下需要进行一定次数的计算。这个计算函数有一个来自Spring Framework的@Async注释,可以在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代码执行非常快,那么将会得到以下输出:
执行大量bla所用的时间:0.0秒。 Bla! Bla! Bla! Bla! . . . 等等
@Async
吗? - skaffman