我有一个spring mvc实现与hibernate。我们有石英照顾预定的作业。我一直在阅读线程和Spring的建议,所有的线程在Spring的产卵应该通过一个托管bean(TaskExecutor?)即线程的产卵应该是Spring管理,而不是开发人员只是产卵一个随机线程调用新线程(new Runnable{})
我的问题是:我有一个产品,用户登录到我的系统,每个来自浏览器的请求是一个线程,Tomcat负责服务他们等,如果需要异步工作,我们产生线程,而请求可以返回给用户。KISS,不是吗?
我在我的系统中缺少TaskExecutor实现,我错过了什么?如果我们从未想过实现它,那么Spring管理的TaskExecutor将如何改变我们的游戏?我无法找到一些文章,清楚地解释为什么我需要自己的TaskExecutor实现/产生自己的线程的危险/性能增益/让Spring管理它的设计增益等。
任何资源共享或解释将不胜感激。感谢的人谁将分享他们的经验
1条答案
按热度按时间4sup72z81#
创建线程是非常困难的。每个线程占用内存,线程可能永远存在。创建时,每个线程至少需要1MB(即使什么都没有发生)。如果创建的线程数量增加,您将耗尽资源(内存,CPU核心等)。
在服务器环境(JEE)中,您应该让容器(Tomcat,WebSphere,无论您使用什么)拥有并处理线程,以便它可以有效地管理它们。
Spring有
TaskExecutor
实现,用于固定线程池(即创建x个线程并重用)或利用容器管理的线程池。**注意:**在Spring 6.1的较新版本中,甚至有对虚拟线程的开箱即用支持。