何时使用选择器以及何时使用阻塞通道(性能)

时间:2014-05-25 19:31:23

标签: java multithreading parallel-processing selector channel

  • 假设有1到30个通道(UDP和TCP通道)
  • 假设我们使用NIO频道
  • 假设我们在多核CPU上运行 有两个选项:

    1. 每个通道定义1个线程(每个线程将被阻塞,直到有数据要读取) (所以所有线程都在等待Q ......直到他们醒来) 或者:
    2. 定义1个线程(带选择器),它将读取数据(每次都来自不同的通道)
  • 最好的方法是什么?

  • 什么会给我最好的表现?

1 个答案:

答案 0 :(得分:0)

在Java中,你没有太多的控制线程(具体)机制,所以你不能真正将线程绑定到某个核心(例如设置亲和力),所以你不能期望有一个单一的性能差异通过选择器进行线程处理或具有多个每通道线程。

鉴于我刚才的介绍,让我们谈谈更高层次,好吗?

当你有多个线程,每个通道一个,并考虑多核处理器时,如果你有一个线程处理,有可能同时执行N个线程(其中N是核心数)如果我们可以保证一旦发出某个请求就没有另一个请求到达,那么它可以有一定速度的请求队列。无论哪种方式,线程的处理最终将通过上下文切换,将线程从核心中取出,看看是否还有其他东西需要完成,如果没有,则将一些线程放回到核心上以执行。

有时候会发生线程不断从一个核心移动到另一个核心,这会导致缓存最终导致性能下降(许多其他因素也会影响)。

所以,根据同时到达的请求数量,我更倾向于使用多线程方法。

干杯。