我有一个用于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)));
}
}
}
}我已经停止了所有其他线程,但这个线程仍然使用“常量”50%的CPU。
发布于 2012-07-17 22:47:42
请参阅Javadoc
如果数据报立即可用,或者如果此通道处于阻塞模式,并且其中一个通道最终变为可用,则将数据报复制到给定的字节缓冲区中,并返回其源地址。如果此通道处于非阻塞模式,并且数据报不能立即可用,则此方法立即返回null。
也许你对channel.receive(recvbuf)的调用没有阻塞,所以你是以初始的速度循环,这解释了你的CPU负载。
https://stackoverflow.com/questions/11524924
复制相似问题