Thread Pool Strategies
non-blocking synchronous I/O 与 non-blocking asynchronous I/O的区别?
Using CompletionHandler
class Connection { … }
class Handler implements CompletionHandler<Integer,Connection> {
public void completed(Integer result, Connection conn) {
int nread = result;
// handle result
}
public void failed(Throwable exc, Connection conn) {
// error handling
}
}
Groups
> What threads invoke the completion handlers?
Network oriented channels bound to a group
– AsynchronousChannelGroup
Completion handlers invoked by pooled threads
Creating a group
// fixed thread pool
ThreadFactory myThreadFactory = …
int nthreads = …
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withFixedThreadPool(nThreads, threadFactory);
Creating a group
// custom thread pool
ExecutorService pool = ...
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withThreadPool(pool);
Creating a group
// custom thread pool
ExecutorService pool = ...
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withThreadPool(pool);
AsynchronousSocketChannel channel =
AsynchronousSocketChannel.open(group);
Thread pools
> Fixed thread pool
– Each thread waits on I/O event
– do I/O completion
– invoke completion handler
– go back to waiting for I/O events
> Cached or custom thread pool
– Internal threads wait on I/O events
– Submit tasks to thread pool to dispatch to
completion handler
Fixed Thread Pool与Cached Thread Pool的区别?
Termination of CompletionHandlers due to uncaught error or runtime
exception causes pooled thread to exit
ByteBuffers
> Not safe for use by multiple concurrent threads
> When I/O operation is initiated then must take
great care not to access buffer until I/O
operation completes
Asynchronous close
● Causes all outstanding I/O operations to fail
Cancellation
● Future interface defines cancel method
● Forceful cancel allows to close channel
With AIO, you can configure the thread pool
(ExecutorService) used by both the AIO kernel
and your application
AsynchronousChannelGroup.withCachedThreadPool
(ExecutorService, initialSize)
AsynchronousChannelGroup.withThreadPool
(ExecutorService)
AsynchronousChannelGroup.withFixedThreadPool
(nThread, ThreadFactory)
…or use the preconfigured/built in Thread Pool that
comes by default…
you just win a prize: a thread's context switch
for free!!
For CachedThreadPool!
Possibility of OOM if the queue grow
indefinitively => monitor the queue
ByteBuffer pool