次のコード スニペットを取得します。
datagramChannel = DatagramChannel
.open(StandardProtocolFamily.INET).setOption(StandardSocketOptions.SO_REUSEADDR, true)
.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);
datagramChannel.configureBlocking(true);
datagramChannel.bind(new InetSocketAddress(filter.getType()
.getPort(filter.getTimeFrameType())));
datagramChannel.join(group, networkInterface);
datagramChannel.receive(buffer);
このコードは にあり、最大 12 の s (したがって 12 のスレッド)Callable
を作成して、Callable
12 の異なるポートから異なるデータを含むマルチキャスト パケットを取得します。3~8秒ごとにネットワーク上で放送されている情報から読み取るだけです。
12 個のポートを継続的にプールすると (情報を待ち、情報を取得するなど)、CPU の 1 つを 100% 消費します。
JVisualVM で実行をプロファイリングすると、実行時間の 90% が 、java.nio.channels.DatagramChannel#receive()
より正確には に費やされていることがわかりcom.sun.nio.ch.DatagramChannelImpl#receiveIntoBuffer()
ます。
ブロッキングモードがCPUを大量に消費する理由がよくわかりません。
ブロッキング モードの代わりに sを使用する記事をいくつか読みましたが、 withがブロッキング チャネルより消費量が少ない
Selector
理由がよくわかりません。while (true)
Selector