0

UDPパケット用のJavaのパケットリスナースレッドと、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)));
            }
        }
    }
}

他のすべてのスレッドを停止しましたが、このスレッドはまだ "CONSTANT" 50% CPU を使用しています。

4

1 に答える 1

2

Javadocを参照してください。

データグラムがすぐに使用できる場合、またはこのチャネルがブロッキング モードであり、最終的に使用可能になる場合、データグラムは指定されたバイト バッファにコピーされ、そのソース アドレスが返されます。このチャネルが非ブロッキング モードで、データグラムがすぐに利用できない場合、このメソッドはすぐに null を返します。

channel.receive(recvbuf) への呼び出しがブロックされない可能性があるため、CPU負荷を説明する無限の速度でループしています。

于 2012-07-17T14:47:41.983 に答える