0

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

直到今天它运行良好,但现在进程 javaw.exe 已开始使用 CONSTANT 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)));
            }
        }
    }
}

我已经停止了所有其他线程,但这个线程仍然使用 "CONSTANT" 50% CPU 。

4

1 回答 1

2

请参阅Javadoc

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

也许您对 channel.receive(recvbuf) 的调用没有阻塞,因此您以无限的速度循环,这解释了您的 CPU 负载。

于 2012-07-17T14:47:41.983 回答