java线程已阻止 等待中,@Async阻止线程继续,直到其他线程完成

博客讨论了在Spring Framework中使用@Async进行异步计算的问题。作者试图计算40000个任务,但在主线程中,由于任务被立即放入队列,for循环结束后立即打印时间,导致实际执行时间无法准确测量。尝试通过限制队列大小来解决,但依然无法获取所有计算的总耗时。问题在于如何在保持异步执行的同时,等待所有任务完成并测量总时间。
摘要由CSDN通过智能技术生成

我有一个应用程序,其中需要计算一定数量的东西 . 此计算函数具有注释@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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值