有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正在阻止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甚至无法处理单个请求

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


共 (2) 个答案

  1. # 1 楼答案

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

    因此,这可能只是因为Netty线程太少,而且正在挨饿,因为与处理邮件工作的40个线程相比,它们从来没有被选中执行

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

  2. # 2 楼答案

    你能提供一个线程转储吗

    jstack <pid>
    

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