首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DatagramChannel,阻塞模式和cpu

DatagramChannel,阻塞模式和cpu
EN

Stack Overflow用户
提问于 2014-02-17 10:05:59
回答 1查看 1.4K关注 0票数 1

我得到以下代码片段:

代码语言:javascript
复制
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()

  1. 我不明白为什么阻塞模式占用这么多CPU。
  2. 我读过一些关于使用Selector而不是阻塞模式的文章,但我不太明白为什么带有Selectorwhile (true)比阻塞通道消耗更少。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 08:14:22

问题是,您使用的是NIO没有选择器。

没有选择器的NIO是可以使用的,但是Channel.receive会不断地尝试读取,这将显示为一个线程的高CPU使用率。

有两种解决方案:-

  • 使用Selector来检测是否有需要读取的内容。只有在选择器指示要读取数据时才调用channel.receive
  • 使用java.net.DatagramSocket/DatagramPacket在阻塞模式下发送/接收。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21826013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档