diff --git a/transport/src/main/java/io/netty/channel/nio/AbstractNioMessageChannel.java b/transport/src/main/java/io/netty/channel/nio/AbstractNioMessageChannel.java index 3ab0010a50..c5cce02bfb 100755 --- a/transport/src/main/java/io/netty/channel/nio/AbstractNioMessageChannel.java +++ b/transport/src/main/java/io/netty/channel/nio/AbstractNioMessageChannel.java @@ -50,8 +50,11 @@ public abstract class AbstractNioMessageChannel extends AbstractNioChannel { assert eventLoop().inEventLoop(); final SelectionKey key = selectionKey(); if (!config().isAutoRead()) { - // only remove readInterestOp if needed - key.interestOps(key.interestOps() & ~readInterestOp); + int interestOps = key.interestOps(); + if ((interestOps & readInterestOp) != 0) { + // only remove readInterestOp if needed + key.interestOps(interestOps & ~readInterestOp); + } } final ChannelPipeline pipeline = pipeline(); @@ -73,9 +76,13 @@ public abstract class AbstractNioMessageChannel extends AbstractNioChannel { closed = true; break loop; } + if (reads++ > READ_BATCH_SIZE) { break; } + if (!config().isAutoRead()) { + break loop; + } } } catch (Throwable t) { if (read) {