我有一个springboot应用程序,该应用程序大量使用带有@Async
批注的线程,但我没有配置ThreadPoolTaskExecutor
,因为从我的想法来看,当线程说thread-1
时,任务,其他任务可以使用此thread-1
。
但是从我从日志中观察到的结果来看,似乎有时某个线程的数量增加到了数千个,如下所示:
2019-07-09 01:48:59.259 INFO 12592 --- [TaskExecutor-1] .s.d.r.c.TestingService :Something is running.
...... //Other threads running
2019-07-09 09:48:59.259 INFO 12592 --- [TaskExecutor-3432] .s.d.r.c.TestingService :Something is running.
我怀疑这些线程都没有被重用。
这是否意味着编号3432
之前的那些线程不会被重用?还要消耗内存吗?
更新:
我实际上检查了日志,例如此thread-255
已完成,但此线程中不再安排任何任务。
2019-07-08 22:23:37.407 INFO 1 --- [TaskExecutor-255] c.d.v.c.j.impl.LoadSomethingAsync : Something is running
答案 0 :(得分:2)
是的,它是无限的。由于@Async
在默认情况下取决于SimpleAsyncTaskExecutor
。它在其doc
通过“ concurrencyLimit” bean属性支持限制并发线程。默认情况下,并发线程数是无限的。
答案 1 :(得分:1)
这是否意味着3432号之前的那些线程没有被重用?
是的。因为是不同的进程和线程。
您需要了解一个线程1触发...然后线程2触发。应用程序如何知道如何处理这些线程的ID?
还要消耗内存吗?
不。当然不是仅仅设置线程的ID并不是所有其他线程仍在运行。其他线程的生命周期无休止。