首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DatagramChannel数据包监听器占用高CPU

DatagramChannel数据包监听器占用高CPU
EN

Stack Overflow用户
提问于 2012-07-17 22:38:20
回答 1查看 1.3K关注 0票数 0

我有一个用于UDP数据包的Java包侦听器线程,以及2-3个其他线程。

它运行良好,直到今天,但现在进程javaw.exe已经开始使用恒定的50%的CPU。

这是我的代码。

代码语言:javascript
复制
public class PacketListenerThread implements Runnable {
    private SocketAddress receivedSocketAddress;
    private DatagramChannel channel;
    private ExecutorService pool;

    public PacketListenerThread(DatagramChannel channel, ExecutorService pool) {
        this.channel = channel;
        this.pool = pool;
    }

    @Override
    public void run() {
        while (true) {
            receivedSocketAddress = null;
            ByteBuffer recvbuf = ByteBuffer.allocate(1400);
            recvbuf.clear();
            try {
                receivedSocketAddress = channel.receive(recvbuf);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (receivedSocketAddress != null) {
                pool.submit(new PacketHandlerRunnable(new TaskObject(receivedSocketAddress, recvbuf)));
            }
        }
    }
}

我已经停止了所有其他线程,但这个线程仍然使用“常量”50%的CPU。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-17 22:47:42

请参阅Javadoc

如果数据报立即可用,或者如果此通道处于阻塞模式,并且其中一个通道最终变为可用,则将数据报复制到给定的字节缓冲区中,并返回其源地址。如果此通道处于非阻塞模式,并且数据报不能立即可用,则此方法立即返回null。

也许你对channel.receive(recvbuf)的调用没有阻塞,所以你是以初始的速度循环,这解释了你的CPU负载。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11524924

复制
相关文章

相似问题

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