【问题标题】:Java application servers execution stack thread affinityJava 应用程序服务器执行堆栈线程亲和性
【发布时间】:2019-03-07 10:26:31
【问题描述】:

假设我们在 Tomcat 或其他应用服务器下部署了 Spring Boot 应用程序。

假设应用程序正在运行并且有一些方法执行堆栈。应用服务器是否可以在应用服务器内置线程池中的线程之间传输执行堆栈?

即线程 ID 可以在应用程序的同一执行堆栈(不是内部应用服务器堆栈)内更改吗?考虑示例:

class FooBar {

  fooBar() {
    foo()
    bar()
  }

  foo() {}

  bar() {}

}

当 fooBar() 在 Thread ID 1 中启动时,App 服务器是否会让方法 bar() 在 Thread ID 1 中运行,而方法 foo() 在 Thread ID 2 中运行?

警告:这是一个棘手的问题,应用服务器会做一些意想不到的事情,这与对 JVM 工作原理的正常理解相反。

【问题讨论】:

  • 为什么要在自己的线程中启动方法,你特地一个接一个地调用,所以它们会驻留在同一个线程中。
  • 更新:请忽略这个答案,见下文。我不启动/停止任何线程,线程由 App Server 专门管理。
  • 对不起,我误读了您的回复。回答您的问题:可能是由于负载平衡的原因。

标签: java multithreading threadpool application-server


【解决方案1】:

无法更改运行(或阻塞)代码的线程。

PS:虽然应用服务器有时会做一些棘手的事情,但它们无法阻止 JVM 约束(直到它们不为自己的 JVM 提供非标准行为)。

【讨论】:

  • 感谢@talex 的回复!
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多