java - DatagramChannel 数据包监听器占用高 CPU 资源

标签 java multithreading udp datagram

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

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

这是我的代码。

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。

最佳答案

参见Javadoc :

If a datagram is immediately available, or if this channel is in blocking mode and one eventually becomes available, then the datagram is copied into the given byte buffer and its source address is returned. If this channel is in non-blocking mode and a datagram is not immediately available then this method immediately returns null.

也许你对channel.receive(recvbuf)的调用不会阻塞,所以你正在以无限的速度循环,这解释了你的CPU负载。

关于java - DatagramChannel 数据包监听器占用高 CPU 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11524924/

相关文章:

java - 在开关盒中使用 double 可能会失去精度

java - Google App Engine - 带有调度程序 Servlet 的 Blob 存储服务

Python Threading.Timer正在调用命令而无需等待

java - 实现 Spring ThreadPoolTask​​Executor 并提供最佳的配置值

python - 使用非阻塞 udp 读取时丢失消息

c++ - C/C++ UDP 服务器问题

java - 如何延长 circleci 中测试的超时时间?

java - 错误:Process 'command '/usr/local/android-studio/jre/bin/java'' finished with non-zero exit value 2

python - 线程模块的引用未被 gc 删除

java - 为什么这个 Java UDP 数据包长度太长?