我得到下面的代碼片斷:DatagramChannel,阻塞模式和cpu
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 Callable
秒(12個線程因而)以檢索不同的數據的多播包來自12個不同的端口。它只能從每3-8秒在網絡上廣播的信息讀取。
當連續彙集12個端口(等待信息,獲取信息,等等)時,它吃掉我的一個CPU的100%。
繪製與JVisualVM執行,我看到的執行時間90%用於java.nio.channels.DatagramChannel#receive()
,更確切地說com.sun.nio.ch.DatagramChannelImpl#receiveIntoBuffer()
。
我不明白爲什麼阻塞模式吃這麼多的CPU。
我已經閱讀使用
Selector
!而非阻塞模式的一些文章,但我真的不明白爲什麼Selector
一個while (true)
會少消耗比阻塞通道。
您不是「連續輪詢12個端口」,除非您設置的讀取超時時間非常短,您沒有向我們顯示。您正在以阻止模式一次從一個端口讀取數據。我希望你沒有做所有的套接字創建和綁定,並且每次都在循環中加入。 – EJP
當我說「連續輪詢12個港口」時,我的意思是說12個港口的信息是同時播出的,而且一旦讀完,我就再去等待和閱讀。讀取超時大約在每個端口5秒鐘。事實上,我不是每次都在做整個創作和約束。 – PomCompot