Package io.netty.channel.nio
Class NioEventLoop
- java.lang.Object
-
- java.util.concurrent.AbstractExecutorService
-
- All Implemented Interfaces:
EventLoop
,EventLoopGroup
,EventExecutor
,EventExecutorGroup
,OrderedEventExecutor
,java.lang.Iterable<EventExecutor>
,java.util.concurrent.Executor
,java.util.concurrent.ExecutorService
,java.util.concurrent.ScheduledExecutorService
public final class NioEventLoop extends SingleThreadEventLoop
SingleThreadEventLoop
implementation which register theChannel
's to aSelector
and so does the multi-plexing of these in the event loop.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
NioEventLoop.SelectorTuple
-
Nested classes/interfaces inherited from class io.netty.util.concurrent.SingleThreadEventExecutor
SingleThreadEventExecutor.NonWakeupRunnable
-
Nested classes/interfaces inherited from class io.netty.util.concurrent.AbstractEventExecutor
AbstractEventExecutor.LazyRunnable
-
-
Field Summary
Fields Modifier and Type Field Description private static long
AWAKE
private int
cancelledKeys
private static int
CLEANUP_INTERVAL
private static boolean
DISABLE_KEY_SET_OPTIMIZATION
private int
ioRatio
private static InternalLogger
logger
private static int
MIN_PREMATURE_SELECTOR_RETURNS
private boolean
needsToSelectAgain
private java.util.concurrent.atomic.AtomicLong
nextWakeupNanos
private static long
NONE
private java.nio.channels.spi.SelectorProvider
provider
private SelectedSelectionKeySet
selectedKeys
private IntSupplier
selectNowSupplier
private java.nio.channels.Selector
selector
The NIOSelector
.private static int
SELECTOR_AUTO_REBUILD_THRESHOLD
private SelectStrategy
selectStrategy
private java.nio.channels.Selector
unwrappedSelector
-
Fields inherited from class io.netty.channel.SingleThreadEventLoop
DEFAULT_MAX_PENDING_TASKS
-
-
Constructor Summary
Constructors Constructor Description NioEventLoop(NioEventLoopGroup parent, java.util.concurrent.Executor executor, java.nio.channels.spi.SelectorProvider selectorProvider, SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler, EventLoopTaskQueueFactory queueFactory)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected boolean
afterScheduledTaskSubmitted(long deadlineNanos)
protected boolean
beforeScheduledTaskSubmitted(long deadlineNanos)
Called from arbitrary non-EventExecutor
threads prior to scheduled task submission.(package private) void
cancel(java.nio.channels.SelectionKey key)
protected void
cleanup()
Do nothing, sub-classes may overrideprivate void
closeAll()
int
getIoRatio()
Returns the percentage of the desired amount of time spent for I/O in the event loop.private static void
handleLoopException(java.lang.Throwable t)
private static void
invokeChannelUnregistered(NioTask<java.nio.channels.SelectableChannel> task, java.nio.channels.SelectionKey k, java.lang.Throwable cause)
protected java.util.Queue<java.lang.Runnable>
newTaskQueue(int maxPendingTasks)
Create a newQueue
which will holds the tasks to execute.private static java.util.Queue<java.lang.Runnable>
newTaskQueue(EventLoopTaskQueueFactory queueFactory)
private static java.util.Queue<java.lang.Runnable>
newTaskQueue0(int maxPendingTasks)
private NioEventLoop.SelectorTuple
openSelector()
private void
processSelectedKey(java.nio.channels.SelectionKey k, AbstractNioChannel ch)
private static void
processSelectedKey(java.nio.channels.SelectionKey k, NioTask<java.nio.channels.SelectableChannel> task)
private void
processSelectedKeys()
private void
processSelectedKeysOptimized()
private void
processSelectedKeysPlain(java.util.Set<java.nio.channels.SelectionKey> selectedKeys)
void
rebuildSelector()
Replaces the currentSelector
of this event loop with newly createdSelector
s to work around the infamous epoll 100% CPU bug.private void
rebuildSelector0()
void
register(java.nio.channels.SelectableChannel ch, int interestOps, NioTask<?> task)
Registers an arbitrarySelectableChannel
, not necessarily created by Netty, to theSelector
of this event loop.private void
register0(java.nio.channels.SelectableChannel ch, int interestOps, NioTask<?> task)
int
registeredChannels()
protected void
run()
Run the tasks in theSingleThreadEventExecutor.taskQueue
private int
select(long deadlineNanos)
private void
selectAgain()
(package private) int
selectNow()
java.nio.channels.spi.SelectorProvider
selectorProvider()
void
setIoRatio(int ioRatio)
Sets the percentage of the desired amount of time spent for I/O in the event loop.private boolean
unexpectedSelectorWakeup(int selectCnt)
(package private) java.nio.channels.Selector
unwrappedSelector()
protected void
wakeup(boolean inEventLoop)
-
Methods inherited from class io.netty.channel.SingleThreadEventLoop
afterRunningAllTasks, executeAfterEventLoopIteration, hasTasks, next, parent, pendingTasks, register, register, register
-
Methods inherited from class io.netty.util.concurrent.SingleThreadEventExecutor
addShutdownHook, addTask, awaitTermination, confirmShutdown, deadlineNanos, delayNanos, execute, inEventLoop, interruptThread, invokeAll, invokeAll, invokeAny, invokeAny, isShutdown, isShuttingDown, isTerminated, lazyExecute, newTaskQueue, peekTask, pollTask, pollTaskFrom, reject, reject, removeShutdownHook, removeTask, runAllTasks, runAllTasks, runAllTasksFrom, runScheduledAndExecutorTasks, shutdown, shutdownGracefully, takeTask, terminationFuture, threadProperties, updateLastExecutionTime, wakesUpForTask
-
Methods inherited from class io.netty.util.concurrent.AbstractScheduledEventExecutor
cancelScheduledTasks, deadlineToDelayNanos, hasScheduledTasks, initialNanoTime, nanoTime, nextScheduledTaskDeadlineNanos, nextScheduledTaskNano, pollScheduledTask, pollScheduledTask, schedule, schedule, scheduleAtFixedRate, scheduleWithFixedDelay, validateScheduled
-
Methods inherited from class io.netty.util.concurrent.AbstractEventExecutor
inEventLoop, iterator, newFailedFuture, newProgressivePromise, newPromise, newSucceededFuture, newTaskFor, newTaskFor, safeExecute, shutdownGracefully, shutdownNow, submit, submit, submit
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface io.netty.util.concurrent.EventExecutor
inEventLoop, inEventLoop, newFailedFuture, newProgressivePromise, newPromise, newSucceededFuture
-
Methods inherited from interface io.netty.util.concurrent.EventExecutorGroup
isShuttingDown, iterator, schedule, schedule, scheduleAtFixedRate, scheduleWithFixedDelay, shutdown, shutdownGracefully, shutdownGracefully, shutdownNow, submit, submit, submit, terminationFuture
-
-
-
-
Field Detail
-
logger
private static final InternalLogger logger
-
CLEANUP_INTERVAL
private static final int CLEANUP_INTERVAL
- See Also:
- Constant Field Values
-
DISABLE_KEY_SET_OPTIMIZATION
private static final boolean DISABLE_KEY_SET_OPTIMIZATION
-
MIN_PREMATURE_SELECTOR_RETURNS
private static final int MIN_PREMATURE_SELECTOR_RETURNS
- See Also:
- Constant Field Values
-
SELECTOR_AUTO_REBUILD_THRESHOLD
private static final int SELECTOR_AUTO_REBUILD_THRESHOLD
-
selectNowSupplier
private final IntSupplier selectNowSupplier
-
selector
private java.nio.channels.Selector selector
The NIOSelector
.
-
unwrappedSelector
private java.nio.channels.Selector unwrappedSelector
-
selectedKeys
private SelectedSelectionKeySet selectedKeys
-
provider
private final java.nio.channels.spi.SelectorProvider provider
-
AWAKE
private static final long AWAKE
- See Also:
- Constant Field Values
-
NONE
private static final long NONE
- See Also:
- Constant Field Values
-
nextWakeupNanos
private final java.util.concurrent.atomic.AtomicLong nextWakeupNanos
-
selectStrategy
private final SelectStrategy selectStrategy
-
ioRatio
private volatile int ioRatio
-
cancelledKeys
private int cancelledKeys
-
needsToSelectAgain
private boolean needsToSelectAgain
-
-
Constructor Detail
-
NioEventLoop
NioEventLoop(NioEventLoopGroup parent, java.util.concurrent.Executor executor, java.nio.channels.spi.SelectorProvider selectorProvider, SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler, EventLoopTaskQueueFactory queueFactory)
-
-
Method Detail
-
newTaskQueue
private static java.util.Queue<java.lang.Runnable> newTaskQueue(EventLoopTaskQueueFactory queueFactory)
-
openSelector
private NioEventLoop.SelectorTuple openSelector()
-
selectorProvider
public java.nio.channels.spi.SelectorProvider selectorProvider()
-
newTaskQueue
protected java.util.Queue<java.lang.Runnable> newTaskQueue(int maxPendingTasks)
Description copied from class:SingleThreadEventExecutor
Create a newQueue
which will holds the tasks to execute. This default implementation will return aLinkedBlockingQueue
but if your sub-class ofSingleThreadEventExecutor
will not do any blocking calls on the thisQueue
it may make sense to@Override
this and return some more performant implementation that does not support blocking operations at all.- Overrides:
newTaskQueue
in classSingleThreadEventExecutor
-
newTaskQueue0
private static java.util.Queue<java.lang.Runnable> newTaskQueue0(int maxPendingTasks)
-
register
public void register(java.nio.channels.SelectableChannel ch, int interestOps, NioTask<?> task)
Registers an arbitrarySelectableChannel
, not necessarily created by Netty, to theSelector
of this event loop. Once the specifiedSelectableChannel
is registered, the specifiedtask
will be executed by this event loop when theSelectableChannel
is ready.
-
register0
private void register0(java.nio.channels.SelectableChannel ch, int interestOps, NioTask<?> task)
-
getIoRatio
public int getIoRatio()
Returns the percentage of the desired amount of time spent for I/O in the event loop.
-
setIoRatio
public void setIoRatio(int ioRatio)
Sets the percentage of the desired amount of time spent for I/O in the event loop. Value range from 1-100. The default value is50
, which means the event loop will try to spend the same amount of time for I/O as for non-I/O tasks. The lower the number the more time can be spent on non-I/O tasks. If value set to100
, this feature will be disabled and event loop will not attempt to balance I/O and non-I/O tasks.
-
rebuildSelector
public void rebuildSelector()
Replaces the currentSelector
of this event loop with newly createdSelector
s to work around the infamous epoll 100% CPU bug.
-
registeredChannels
public int registeredChannels()
Description copied from class:SingleThreadEventLoop
Returns the number ofChannel
s registered with thisEventLoop
or-1
if operation is not supported. The returned value is not guaranteed to be exact accurate and should be viewed as a best effort.- Overrides:
registeredChannels
in classSingleThreadEventLoop
-
rebuildSelector0
private void rebuildSelector0()
-
run
protected void run()
Description copied from class:SingleThreadEventExecutor
Run the tasks in theSingleThreadEventExecutor.taskQueue
- Specified by:
run
in classSingleThreadEventExecutor
-
unexpectedSelectorWakeup
private boolean unexpectedSelectorWakeup(int selectCnt)
-
handleLoopException
private static void handleLoopException(java.lang.Throwable t)
-
processSelectedKeys
private void processSelectedKeys()
-
cleanup
protected void cleanup()
Description copied from class:SingleThreadEventExecutor
Do nothing, sub-classes may override- Overrides:
cleanup
in classSingleThreadEventExecutor
-
cancel
void cancel(java.nio.channels.SelectionKey key)
-
processSelectedKeysPlain
private void processSelectedKeysPlain(java.util.Set<java.nio.channels.SelectionKey> selectedKeys)
-
processSelectedKeysOptimized
private void processSelectedKeysOptimized()
-
processSelectedKey
private void processSelectedKey(java.nio.channels.SelectionKey k, AbstractNioChannel ch)
-
processSelectedKey
private static void processSelectedKey(java.nio.channels.SelectionKey k, NioTask<java.nio.channels.SelectableChannel> task)
-
closeAll
private void closeAll()
-
invokeChannelUnregistered
private static void invokeChannelUnregistered(NioTask<java.nio.channels.SelectableChannel> task, java.nio.channels.SelectionKey k, java.lang.Throwable cause)
-
wakeup
protected void wakeup(boolean inEventLoop)
- Overrides:
wakeup
in classSingleThreadEventExecutor
-
beforeScheduledTaskSubmitted
protected boolean beforeScheduledTaskSubmitted(long deadlineNanos)
Description copied from class:AbstractScheduledEventExecutor
Called from arbitrary non-EventExecutor
threads prior to scheduled task submission. Returnstrue
if theEventExecutor
thread should be woken immediately to process the scheduled task (if not already awake).If
false
is returned,AbstractScheduledEventExecutor.afterScheduledTaskSubmitted(long)
will be called with the same value after the scheduled task is enqueued, providing another opportunity to wake theEventExecutor
thread if required.- Overrides:
beforeScheduledTaskSubmitted
in classAbstractScheduledEventExecutor
- Parameters:
deadlineNanos
- deadline of the to-be-scheduled task relative toAbstractScheduledEventExecutor.nanoTime()
- Returns:
true
if theEventExecutor
thread should be woken,false
otherwise
-
afterScheduledTaskSubmitted
protected boolean afterScheduledTaskSubmitted(long deadlineNanos)
Description copied from class:AbstractScheduledEventExecutor
SeeAbstractScheduledEventExecutor.beforeScheduledTaskSubmitted(long)
. Called only after that method returns false.- Overrides:
afterScheduledTaskSubmitted
in classAbstractScheduledEventExecutor
- Parameters:
deadlineNanos
- relative toAbstractScheduledEventExecutor.nanoTime()
- Returns:
true
if theEventExecutor
thread should be woken,false
otherwise
-
unwrappedSelector
java.nio.channels.Selector unwrappedSelector()
-
selectNow
int selectNow() throws java.io.IOException
- Throws:
java.io.IOException
-
select
private int select(long deadlineNanos) throws java.io.IOException
- Throws:
java.io.IOException
-
selectAgain
private void selectAgain()
-
-