Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java NIO - non-blocking channels vs AsynchronousChannels

Java NIO offers SocketChannel and ServerSocketChannel which can be set to non-blocking mode (asynchronous). Most of the operations return a value that corresponds to success or that the operation is not yet done. What is the purpose of AynchronousSocketChannel and AsynchronousServerSocketChannel then, apart from the callback functionalities?

like image 832
Bober02 Avatar asked Mar 04 '14 16:03

Bober02


People also ask

Is Java NIO asynchronous?

The asynchronous channel APIs were introduced into the existing java. nio. channels package, simply put – by prefixing the class names with the word Asynchronous. Some of the core classes include: AsynchronousSocketChannel, AsynchronousServerSocketChannel and AsynchronousFileChannel.

Is Java NIO non blocking?

Unlike Java IO, Java NIO is a non-blocking IO. This means that if a thread is invoking a read() or write() operation, that thread is not blocked until there is some data to read or the data is fully written rather the thread go on something else.

What is blocking and non blocking in Java?

Java IO's various streams are blocking. It means when the thread invoke a write() or read(), then the thread is blocked until there is some data available for read, or the data is fully written. Non blocking I/O. Non blocking IO does not wait for the data to be read or write before returning.

What are NIO channels?

In Java NIO, the channel is a medium used to transports the data efficiently between the entity and byte buffers. It reads the data from an entity and places it inside buffer blocks for consumption. Channels act as gateway provided by java NIO to access the I/O mechanism.


2 Answers

which can be set to non-blocking mode (asynchronous)

There's your misapprehension, right there. Non-blocking mode is different from asynchronous mode.

A non-blocking operation either transfers data or it doesn't. In either case there is no blocking, and the operation is complete once it returns. This mode is supported by SocketChannel, DatagramSocketChannel, and Selector.

An asynchronous operation starts when you call the method and continues in the background, with the result becoming available at a later time via a callback or a Future. This mode is supported by the AsynchronousSocketChannel etc classes you mention in your question.

like image 81
user207421 Avatar answered Oct 17 '22 06:10

user207421


The AynchronousSocketChannel and AsynchronousServerSocketChannel come into their own when using the methods that take a CompletionHandler.

For example the code in a server might look like this:

asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 

Where ConnectionHander is an implementation of CompletionHandler that deals with client connections.

The thread that makes the accept call can then continue doing other work and the NIO API will deal with scheduling the callback to the CompletionHandler when a client connection is made (I believe this is an OS level interupt).

The alternative code might look like this:

SocketChannel socketChannel = serverSocketChannel.accept();

Depending on the mode, the calling thread is now blocked until a client connection is made or null is returned leaving you to poll. In both cases, it's you that has to deal with the threads, which generally means more work.

At the end of the day, you take your pick based on your particular use-case, though I've generally the former produces clearer more reliable code.

like image 6
Nick Holt Avatar answered Oct 17 '22 05:10

Nick Holt