【问题标题】:Understanding tomcat/spring boot multi threading了解tomcat/spring boot多线程
【发布时间】:2019-01-16 12:18:10
【问题描述】:

我在 spring-boot 的基础上创建了一个简单的 Web 应用程序。它获取请求,执行一些块操作(例如写入从 1 到 10_000 的控制台编号)并返回简单的响应。
当我开始使用 JVisual VM 对其进行测试时,我注意到线程以一种奇怪的方式工作。
一开始,在低负载的情况下,它们不会同时工作,而是轮流工作:

如果我尝试高负载应用程序,则 Tomcat 会创建新线程(据我了解,这没关系),然后线程同时工作:


我使用Netling app 来测试应用程序。它只是对 localhost 的简单请求,没什么特别的。
你能解释一下为什么它以这种方式工作吗?或者提供一些带有描述的链接。
提前致谢!

【问题讨论】:

  • 请求被排队,只要当前启动的线程数可以足够快地清空队列,就不会启动额外的线程。您的图像还显示,在这两种情况下,它们同时工作(参见线程 10、7 和 4
  • @M.Deinum。谢谢你的解释。你对第一个屏幕截图完全正确,这是我的错,但我之前在所有测试中都没有看到这种情况
  • @M.Deinum 另外,问题不在于队列和池大小。主要问题是为什么所有线程不能同时工作?
  • 他们为什么要这样做?如果没有工作,他们为什么要这样做……而且并发运行的线程数受您拥有的内核数的限制。

标签: java spring multithreading spring-boot tomcat


【解决方案1】:

我已经了解问题的根源。
在我看到的JVisualVM上,所有线程都被对方阻塞了,但我不知道为什么。现在很清楚了 - 我已经使用 system.out.println() 作为块操作,但是线程不能同时使用它,控制台被锁定。
我已将控制台输出更改为文件输出(使用线程名作为文件名以防止锁定)并再次启动应用程序。现在它按预期工作了。

愚蠢的错误,但我希望它对某人有用:)

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 2016-04-20
    • 2021-04-30
    • 2021-11-07
    • 2020-06-17
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多