正在阻止java Netty线程
我的系统中有3个线程池执行器
一个用于Netty的主进程,另一个用于Netty的工作进程,最后一个用于处理临时处理(向邮件服务器发送请求)
ExecutorService bossExecutors = Executors.newFixedThreadPool(1,
new ServerThreadFactory("netty-boss"));
ExecutorService workerExecutors = Executors.newFixedThreadPool(10,
new ServerThreadFactory("netty-worker"));
ChannelFactory factory = new NioServerSocketChannelFactory(
bossExecutors,
workerExecutors,
Runtime.getRuntime().availableProcessors());
ExecutorService mailExecutor = Executors.newFixedThreadPool(40);
在mailExecutor
开始向邮件服务器发出请求之前,这一切都很正常。在使用mailExecutor
的批处理请求(通常向邮件服务器发出5000多个请求)完成之前,netty线程会被阻塞
我不明白为什么netty线程在那一次似乎被阻塞了,因为我已经分配了明确的线程池。在这段时间里,Netty甚至无法处理单个请求
你知道为什么会这样或者我做错了什么吗
# 1 楼答案
听起来像是日程安排的问题。您有40个线程处于重载状态,而可用处理器处理复杂工作的线程数(创建工厂时可用处理器()的计数是多少?)
因此,这可能只是因为Netty线程太少,而且正在挨饿,因为与处理邮件工作的40个线程相比,它们从来没有被选中执行
也可能是由于某些原因,您的工作线程在邮件线程完成时被阻塞,这可能是由于正在同步的某个共享对象(是否存在netty线程需要写入的要发送的邮件队列或列表,以及邮件线程在发送时锁定了哪些队列或列表?)
# 2 楼答案
你能提供一个线程转储吗
此外,您不应该为worker/poss线程池使用固定线程池。使用缓存的,这样你可以确保你永远不会陷入饥饿。您应该在构造函数中用3参数指定工作计数