不明白@async的某些行为

时间:2010-11-15 11:21:29

标签: java spring asynchronous threadpool

我在理解@async注释的某个方面时遇到了一些困难,可能还有整个线程和线程池的工作方式。当我在我的spring配置文件中设置它时:

<task:executor id="WhifExecutor" pool-size="10"/>
<task:annotation-driven executor="WhifExecutor" />

这不意味着只会启动10个线程吗?然而,当我运行一个具有@async 1000次的函数时,它会在调用后立即继续执行其余的代码(控制台中会显示一条简单的消息来显示函数被调用的次数)。然后一段时间后,池函数开始返回它们的值,但奇怪的是只有1个池和10个不同的线程。这里发生了什么?如何调用所有这1000个函数但只使用10个线程?它是否可能在启动线程之前将所有这些都放在某个堆栈上?我尝试阅读有关此文档的文档,但我找不到任何有关此现象的信息。

另外,有没有办法让它等待线程开始运行,这样我就不会立即调用几千个函数了?

1 个答案:

答案 0 :(得分:6)

  

在启动线程之前是否可以将它们全部放在堆栈上?

不是堆叠,而是队列。

执行程序将被分配10个线程。如果所有10个线程都忙,并且添加了新任务,它们将被添加到队列中,并依次执行。一次不会执行超过10个任务。