controller 到达一个service,service里面创建了一个线程池,以后每次进service都创建一个线程池吗?

controller 到达一个service,service里面创建了一个线程池,以后每次进service都创建一个线程池吗?,第1张

一般不会,

一般java web项目里controller和service都是单例的(@controllerhe @service注解默认单例),

也就是说整个jvm唯一,

service里的线程池如果是在service初始化函数时new并赋值的 ,那么就是和service一样唯一的。

但是如果service里的线程池是在具体的方法中new的,那么每次请求进入该方法就会new一个线程池。并且如果不主动调用线程池的shutdown方法那么线程池会在所有线程跑完之后被gc回收。

显然前一种使用方式是合适的

在 Dubbo 中使用 ThreadLocal ,如果采用默认的设置,每次 Dubbo 调用结束,Dubbo 处理响应线程并不会被销毁, 而是归还到线程池中。而从 ThreadLocal 源码可以看出,每次我们设置的值其实会存在位于 Thread 中 ThreadLocalMap 变量中。

这就导致,下次如果 Dubbo 处理响应恰好继续使用到这个线程,该线程就能调用到上次响应中设置在 ThreadLocal 设置的值。这就引起内存泄露,可能还会导致业务上异常。其实并不止在 Dubbo 中,该案例还会发生在 web项目中,只要相关使用线程池的,都有可能发生。

dubbo 默认采用单一长连接加线程池方式处理调用。

默认采取 Dispatcher=all 的分发策略,所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。

线程池在缺省配置为固定大小线程池,启动时建立线程,不关闭,一直持有。

使用 Threadlocal,我们需要注意几点:

调整线程池大小配置是

dubbo.protocol.threads = 5000

调整线程池类型配置是

dubbo.protocol.threadpool = cached

调整事件处理方式配置是

dubbo.protocol.dispatcher = message

或者

<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

线程池,thread pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。

功能:应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。

为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待 *** 作状态,当一个等待 *** 作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。

扩展资料:

应用范围

1、需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。

2、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。

3、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分 *** 作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。

参考资料来源:百度百科—线程池


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11838797.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存