Fin*_*005 10 java queue spring multithreading asynchronous
我有一个应用程序,其中需要计算一定数量的东西.此计算函数具有注释@Async(来自Spring Framework),这使得可以在4个线程上运行这些计算.问题是我需要大约40000个这些计算,我想知道所有计算的开始和结束之间的时间,所以我看到调用计算函数的for循环之前和之后的时间.但是现在所有的计算都被放入队列中,因此for循环立即结束,时间就像1秒钟,而计算完成需要几个小时.我已经尝试将最大队列大小设置为大约100(也很好地减少了内存使用量),但这也没有解决方案,因为我将错过它花费的总时间中的最后100次计算.
这是一些说明同样问题的代码:
执行课程:
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.");
}
}
Run Code Online (Sandbox Code Playgroud)
以及执行计算的类:
@Service
public class Bar {
@Async
public void executeBla() {
System.out.println("Bla!");
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致以下输出(假设Foo中的代码执行速度非常快):
Time it took for a lot of bla to execute: 0.0 seconds. Bla! Bla! Bla! Bla! . . . etc
ska*_*man 31
如果您需要等待执行完成,那么您可以返回a Future
作为返回值,例如
@Async
public Future<Void> executeBla() {
System.out.println("Bla!");
return new AsyncResult<Void>(null);
}
Run Code Online (Sandbox Code Playgroud)
这是虚假造作的,因为有返回没有实际价值,但它仍然会允许调用代码等待所有执行到结束:
public void executeBlaALotOfTimes() {
long before = System.currentTimeMillis();
Collection<Future<Void>> futures = new ArrayList<Future<Void>>();
for (int i = 0; i<40000; i++) {
futures.add(executeBla());
}
for (Future<Void> future : futures) {
future.get();
}
long after = System.currentTimeMillis();
System.out.println("Time it took for a lot of bla to execute: " + (after - before) / 1000.0 + " seconds.");
}
Run Code Online (Sandbox Code Playgroud)
这里,第一个循环触发异步任务并将期货存储在列表中.秒循环然后迭代期货,等待每一个完成.
归档时间: |
|
查看次数: |
13142 次 |
最近记录: |