0

在我的 netty 服务器中,我按如下方式创建线程池。

    ChannelFactory factory =
        new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(threadFactory),
            Executors.newCachedThreadPool(threadFactory);

有时,我注意到在服务器处理了一定数量的连接后,后续连接会等待其中一个先验线程完成。

从 newCachedThreadPool 的文档中,我假设线程池会根据需要创建新线程。有人可以帮我理解为什么我的一些连接被阻止直到之前的连接完成吗?netty 不会为新连接创建新线程,因为所有现有线程都很忙吗?

我该如何解决?

任何帮助表示赞赏!

4

1 回答 1

1

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。

在任何时候,最多 nThreads 个线程将是活动的处理任务。

如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。

池中的线程将一直存在,直到显式关闭。

来自 Oracle Java Doc for newCachedThreadPool

所以线程号由 Executors.newCachedThreadPool 固定

在 netty 中默认编号是 processor_number *2

:)

于 2013-09-13T02:55:49.740 回答