我得到以下代码片段:
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);这段代码位于一个Callable中,我创建了多达12个Callables (因此,12个线程)来从12个不同端口检索具有不同数据的多播数据包。它只从网络上每3-8秒读取一次的信息。
当连续地集中12个端口(等待信息、获取信息等)时,它占用了我的一个CPU的100%。
使用JVisualVM分析执行,我看到90%的执行时间用于java.nio.channels.DatagramChannel#receive(),更准确地说是com.sun.nio.ch.DatagramChannelImpl#receiveIntoBuffer()。
Selector而不是阻塞模式的文章,但我不太明白为什么带有Selector的while (true)比阻塞通道消耗更少。发布于 2014-11-05 08:14:22
问题是,您使用的是NIO没有选择器。
没有选择器的NIO是可以使用的,但是Channel.receive会不断地尝试读取,这将显示为一个线程的高CPU使用率。
有两种解决方案:-
https://stackoverflow.com/questions/21826013
复制相似问题