Java 网状线被堵塞

Java 网状线被堵塞,java,netty,Java,Netty,我的系统中有3个线程池执行器 一个用于Netty的主进程,另一个用于Netty的工作进程,最后一个用于处理特殊处理(向邮件服务器发送请求) 在mailExecutor开始向邮件服务器发出请求之前,这一切都很正常。在使用maileExecutor(通常向邮件服务器发出5000多个请求)的批处理请求完成之前,netty线程会被阻塞 我不明白为什么netty线程会在那个时候被阻塞,因为我已经分配了明确的线程池。在此期间,Netty甚至无法处理单个请求 你知道为什么会这样,或者我做错了什么吗?听起来像是

我的系统中有3个线程池执行器

一个用于Netty的主进程,另一个用于Netty的工作进程,最后一个用于处理特殊处理(向邮件服务器发送请求)

mailExecutor
开始向邮件服务器发出请求之前,这一切都很正常。在使用
maileExecutor
(通常向邮件服务器发出5000多个请求)的批处理请求完成之前,netty线程会被阻塞

我不明白为什么netty线程会在那个时候被阻塞,因为我已经分配了明确的线程池。在此期间,Netty甚至无法处理单个请求


你知道为什么会这样,或者我做错了什么吗?

听起来像是日程安排问题。您有40个线程处于重载状态,而可用处理器处理复杂工作的线程数(创建工厂时可用处理器()的计数是多少?)

因此,可能是Netty线程太少了,并且正处于饥饿状态,因为与处理邮件工作的40个线程相比,Netty线程从未被选中执行


也可能是由于某些原因,您的工作线程在邮件线程完成时被阻塞,这可能是由于正在同步的某个共享对象(是否存在netty线程需要写入的要发送的邮件队列或列表,以及邮件线程在发送时已锁定的队列或列表?)

能否提供线程转储

jstack <pid>
jstack

此外,您不应该为worker/poss线程池使用固定线程池。使用缓存的,这样你可以确保你永远不会陷入饥饿。您应该使用构造函数中的3参数指定工作线程计数。

我使用workers count=Runtime.getRuntime().availableProcessors()将fixed threadpool更改为Cached threadpool,但它似乎仍在发生。这里是线程转储:谢谢。问题是发送到邮件服务器是一个阻塞操作。因此,您应该在执行发送操作的处理程序前面添加ExecutionHandler。否则,您将阻止netty的IO线程。
jstack <pid>