Spring 和虚拟线程

问题描述 投票:0回答:1

我从 JDK21 和虚拟线程开始。 我正在使用 Spring Framework 6.1.12 和 Spring Batch 5.1.2

我成功地使用了一个简单的任务执行器,如下所示:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize"   value="10" />
    <property name="maxPoolSize"    value="20" />
    <property name="waitForTasksToCompleteOnShutdown" value="true" />
</bean>

为了测试虚拟线程和JDK21,我改成这样:

<bean id="taskExecutor" class="org.springframework.core.task.VirtualThreadTaskExecutor">
    <constructor-arg name="threadNamePrefix" value="VIRTUAL-thread" />
</bean>

所以,我有一些疑问:

  1. 这个“迁移”对吗?
  2. 我可以确定它使用的是虚拟线程吗?如果我打开 VirtualThreadTaskExecutor,里面有一个 VirtualThreadDelegate,其中所有方法都会引发异常。
  3. Spring中有“虚拟线程池”吗?或者,并发有 20 个虚拟线程池是否可能或有意义?我认为虚拟线程被设计为不被池化,但这对我来说是一个很大的改变,我想确定我正在以正确的方式做。

所以,简而言之,我已经阅读了有关虚拟线程和性能的精彩内容,并且我想在 Spring 和 Spring Batch 中执行虚拟线程来测试我的软件中的性能。如果您有一些从平台线程迁移到虚拟线程的指南、技巧等,我们非常感谢您的帮助。

java spring multithreading spring-batch virtual-threads
1个回答
0
投票

关于你的问题。

  1. 某种程度上,您可能最好使用
    SimpleAsyncTaskExecutor
    ,它允许更多的配置和控制。
public SimpleAsyncTaskExecutor taskExecutor() {
  var taskExecutor = new SimpleAsyncTaskExecutor();
  taskExecutor.setVirtualThreads(true);
  taskExecutor.setConcurrencyLimit(20); // based on your max poolsize
  return taskExecutor;
}
  1. 你正在看错误的,实际上有2个不同的,因为Spring是作为一个多版本jar发布的。特定于 JDK 21 的代码位于“不同的目录”中,并且仅在 JDK 21+ 上加载,并且将加载而不是您正在查看的代码。

  2. 不要缓存虚拟线程,因为这没有意义,也不是为此设计的。
  3. 最后调整一下你的期望,你可能不会获得太多的性能提升,但能够在相同的时间内使用相同的硬件做更多的事情。由于更有效的线程使用。它们不是一个神奇的解决方案。虚拟线程旨在帮助阻塞 IO 任务(然后它将停止),如果您打算增加计算繁重的任务,您会感到失望,甚至可能面临性能下降而不是增加。

© www.soinside.com 2019 - 2024. All rights reserved.