【问题标题】:Springboot thread number keep increasingSpringboot线程数不断增加
【发布时间】:2019-07-08 17:54:48
【问题描述】:

我有这个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

【问题讨论】:

    标签: java multithreading spring-boot asynchronous


    【解决方案1】:

    是的,它是无限的。因为@Async 默认依赖于SimpleAsyncTaskExecutor。它在其doc

    中说

    支持通过“concurrencyLimit”bean 属性限制并发线程。默认情况下,并发线程数是无限的。

    【讨论】:

    • 所以我假设只要springboot不重启,就会消耗很多内存对吧?随着线程数的增加..
    • @hades 它应该取决于线程的使用情况,如果线程以一种长期存在的方式编写,那么新线程会不断产生。但是名称TestingService 听起来像是@Service 的有效候选者,应该是Singleton scope,只是不要在方法之间使用共享变量(副作用)
    • 这对我来说读起来不同:“并发线程的数量”。这并没有说明线程没有被重用。我宁愿怀疑线程数量最少,并且正在释放它们并创建新线程。在我看来,您应该设置 corePoolSize,因为默认值为 1。
    • @Christopher 啊,你说得好,我在网上搜索了但不能真正理解 corePoolSize 的概念,介意详细说明吗?
    • @hades 看看this question
    【解决方案2】:

    是否意味着3432号之前的那些线程没有被重用?

    是的。因为是不同的进程和线程。

    您需要了解一个线程 1 触发...然后线程 2 触发。应用程序如何知道如何处理这些线程 ID?

    还要消耗内存?

    没有。当然不是只是设置线程的ID,并不是所有其他线程仍在运行。其他线程的生命周期没有别的结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 2015-12-09
      • 2021-10-03
      • 2012-03-31
      相关资源
      最近更新 更多