java.nio.channels.Selector Class in Java
Last Updated :
08 Dec, 2023
A selector is a tool that helps you keep an eye on one or more NIO channels and figure out when they're ready to transfer data. In Java NIO, the Selector is a key player that looks at multiple Java NIO Channel instances and figures out which ones are good to go for actions like reading or writing.
This allows a single thread to handle many channels, making it easy to manage multiple network connections.

Why Selector?
Using a selector helps us do more with fewer threads, just one instead of many. Frequent thread switching can burden the operating system and use up memory.
- The fewer threads we use, the more efficient our system gets.
- It's important to note that modern operating systems and CPUs are getting better at handling multiple tasks.
- helps reduce the resource needs of using many threads over time.
Selectors can do more than just read data, they can also keep an eye on incoming network connections and make sending data through slower channels easier.
How to Create a Selector?
You can create a selector by simply using the open method of the Selector class. This method makes use of the system's default selector provider to generate a fresh selector
Selector selector = Selector.open();
Registering Channel with the Selector
For a selector to monitor any channels, we must register these channels with the selector.
This is done by calling the register method of the SelectableChannel. However, the channel must be in non-blocking mode before registering it with the selector:
channel.configureBlocking(false);
SelectionKey selectionKey = channel.register(selector, SelectionKey.OP_READ);
The second parameter defines an interest set, meaning what events we are interested in listening for in the monitored channel, via the selector.
There are four different events you can listen for:
- Connect: when a client attempts to connect to the server(SelectionKey.OP_CONNECT).
- Accept: when the server accepts a connection from a client(SelectionKey.OP_ACCEPT).
- Read: when the server is ready to read from the channel(SelectionKey.OP_READ).
- Write: when the server is ready to write to the channel(SelectionKey.OP_WRITE).
Selection Key
As you saw in the above section, when we register a Channel with a Selector the register() method returns a SelectionKey object. This SelectionKey object contains a few interesting properties:
- The interest set
- The ready set
- The channel
- The selector
- Attaching Objects
The Interest set
An interest set specifies the events that the selector should monitor on a channel. This interest set is represented as an integer value, and we can retrieve this information as below.
int set = selectionKey.interestOps();
boolean isAccept = set & SelectionKey.OP_ACCEPT;
boolean isConnect = set & SelectionKey.OP_CONNECT;
boolean isRead = set & SelectionKey.OP_READ;
boolean isWrite = set & SelectionKey.OP_WRITE;
Initially, we obtain the interest set using the interestOps method of SelectionKey.
When we use a bitwise AND operation on these two values, it yields a boolean value that indicates whether the event is being monitored or not.
The ready set
The ready set is the set of operations the channel is ready for. We can access the ready set like below.
int readySet = selectionKey.readyOps();
We can also use below four methods below instead, which all return a boolean.
- selectionKey.isAcceptable();
- selectionKey.isConnectable();
- selectionKey.isReadable();
- selectionKey.isWritable();
The Channel
We can access the channel from selectionKey as below:
Channel channel = selectionKey.channel();
The Selector
We can obtain the selector object from selectionKey object as below:
Selector selector = selectionKey.selector();
Attaching Objects
We can attach an object to a SelectionKey. Here is how we can attach and get objects from a SelectionKey:
selectionKey.attach(object);
Object attachedObject = selectionKey.attachment();
Channel Key Selection
Once we have registered one or more channels with a Selector, we can use one of the select() methods. These methods provide us with the channels that are "ready" for the events we care about (such as connect, accept, read, or write).
int channels = selector.select();
int channels = selector.select(long timeout);
int channels = selector.selectNow();
- select() blocks unless one channel is ready for the events we registered for.
- select(long timeout) does the same as above except it blocks for a maximum of timeout milliseconds.
- selectNow() does not block at all. It returns immediately with whatever channels are ready.
Once we have called the select() methods and its return value has indicated that one or more channels are ready, you can access the ready channels via the selected key set, by calling the selectedKeys() method as below:
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Other Selector Methods
We have some more selector methods available mentioned with proper description and usage.
|
selector.wakeup();
| The wakeup() method is used to interrupt the blocking select() call. It's typically called from another thread to wake up the select() method.
| When you need to modify the Selector or stop it from blocking, you can use wakeup() to wake up the select() call and make it return.
|
selector.close();
| The close() method is used to close the Selector. Once a Selector is closed, it can no longer be used to monitor channels.
| It's important to close the Selector when you are done with it to release system resources.
|
Practical Examples
Let's explore a couple of practical examples to see the Selector class in action.
Example 1: Simple Selector Usage
In this example, we are going to use Java NIO Selector to monitor a single non-blocking SocketChannel for read operations. The steps are as follows:
- Create a Selector to efficiently manage I/O readiness monitoring.
- Configure a non-blocking SocketChannel for reading data from a remote server.
- Register the SocketChannel with the Selector, specifying that you're interested in the OP_READ operation.
- Use the selector.select() to wait for at least one registered channel to be ready for reading.
// Create a Selector
Selector selector = Selector.open();
// Configure and register a non-blocking SocketChannel for read operationsSocketChannel
socketChannel = SocketChannel.open(new InetSocketAddress("example.com", 80));
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
// Wait for a ready channelint
readyChannels = selector.select();
Example 2: Using Multiple Channels
In this example, we have extended the usage of the Java NIO Selector to manage multiple channels, each with different I/O operations. The steps are as follows:
- Create a Selector to efficiently manage I/O readiness monitoring.
- Create and configure multiple channels according to your application needs.
- Register each channel with the Selector, specifying the specific I/O operation you're interested in for each channel.
- Use selector.select() to efficiently wait for at least one of the registered channels to be ready for its specified operation (e.g., read or write).
// Create a Selector
Selector selector = Selector.open();
// Create and configure multiple channels
SocketChannel channel1 = /* Create and configure your channel */;
SocketChannel channel2 = /* Create and configure another channel */;
// Register channels for specific operations
channel1.register(selector, SelectionKey.OP_READ);
channel2.register(selector, SelectionKey.OP_WRITE);
// Wait for ready channelsint ready
Channels = selector.select();
Complete Example
To practice the knowledge we have learned in the previous sections, let's see a complete client-server example
- We’ll build an echo server and an echo client.
- In this kind of setup, the client connects to the server and starts sending messages to it.
- The server echoes messages sent by each client.
When the server encounters a specific message, such as the end, it interprets it as the end of the communication and closes the connection with the client
Create a server: NIOServer.java
Java
//Java Program to test
//echo server using NIO Selector
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
//Driver class for NIOServer
public class NIOServer {
//Main method
public static void main(String[] args) throws IOException {
// Create a new Selector
Selector selector = Selector.open();
// Create a ServerSocketChannel, bind it, and configure it as non-blocking
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress("localhost", 5454));
serverChannel.configureBlocking(false);
// Register the server socket channel with the Selector for accepting connections
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
ByteBuffer buffer = ByteBuffer.allocate(256);
System.out.println("Server started and listening on port 5454...");
while (true) {
// Select ready channels using the Selector
selector.select();
// Get the set of selected keys
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
// Accept a new client connection
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = server.accept();
clientChannel.configureBlocking(false);
// Register the client channel with the Selector for reading
clientChannel.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
// Read data from the client
SocketChannel client = (SocketChannel) key.channel();
buffer.clear();
int bytesRead = client.read(buffer);
if (bytesRead == -1) {
// Client closed the connection
key.cancel();
client.close();
continue;
}
buffer.flip();
String receivedMessage = new String(buffer.array(), 0, bytesRead);
// Process the received message (e.g., echo it back to the client)
System.out.println("Received: " + receivedMessage);
// Prepare the buffer for writing and echo the received message back to the client
buffer.rewind();
client.write(buffer);
}
// Remove the processed key from the set
keyIterator.remove();
}
}
}
}
Output of NIO Server:

Explanation
- The code is a Java NIO implementation of an echo server.
- It uses a Selector for efficient I/O handling.
- Listens on port 5454, accepts connections, and echoes received data.
- Non-blocking I/O allows handling multiple connections simultaneously.
- The server loop monitors events on registered channels.
- Accepted connections are registered for reading, and data is echoed back to clients.
Create a client: NIOClient.java
In this example we will create a NIOClient, using SocketChannel.
Java
//Java Program to create a
//echo client using NIO Selector
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
//Driver class for NIOClient
public class NIOClient {
//Main method
public static void main(String[] args) throws IOException {
// Create a socket channel and connect to the server
SocketChannel clientChannel = SocketChannel.open();
clientChannel.connect(new InetSocketAddress("localhost", 5454));
ByteBuffer buffer = ByteBuffer.allocate(256);
String message = "Hello, NIO Server!";
// Message to send to the server
buffer.clear();
buffer.put(message.getBytes());
buffer.flip();
// Send the message to the server
while (buffer.hasRemaining()) {
clientChannel.write(buffer);
}
buffer.clear();
// Read the server's response
clientChannel.read(buffer);
buffer.flip();
// Convert the response to a String and print it
String response = new String(buffer.array(), 0, buffer.limit());
System.out.println("Server Response: " + response);
clientChannel.close();
}
}
Output of NIO Client:

Explanation of the above program:
- Creates a
SocketChannel
and connects to a server at localhost on port 5454. - Prepares a message ("Hello, NIO Server!") and sends it to the server.
- Reads the server's response into a buffer and converts it to a String.
- Prints the server's response.
- Closes the client channel after communication.
Conclusion
The java.nio.channels.Selector class is an important component for mastering non-blocking I/O in Java. By understanding how to create a Selector, work with SelectionKey objects, and leverage the select() method, we can significantly enhance the efficiency and responsiveness of our Java applications.
Similar Reads
Java Tutorial Java is a high-level, object-oriented programming language used to build web apps, mobile applications, and enterprise software systems. Known for its Write Once, Run Anywhere capability, which means code written in Java can run on any device that supports the Java Virtual Machine (JVM).Syntax and s
10 min read
Basics
Introduction to JavaJava is a high-level, object-oriented programming language developed by Sun Microsystems in 1995. It is platform-independent, which means we can write code once and run it anywhere using the Java Virtual Machine (JVM). Java is mostly used for building desktop applications, web applications, Android
4 min read
Java Programming BasicsJava is one of the most popular and widely used programming language and platform. A platform is an environment that helps to develop and run programs written in any programming language. Java is fast, reliable and secure. From desktop to web applications, scientific supercomputers to gaming console
4 min read
Java MethodsJava Methods are blocks of code that perform a specific task. A method allows us to reuse code, improving both efficiency and organization. All methods in Java must belong to a class. Methods are similar to functions and expose the behavior of objects.Example: Java program to demonstrate how to crea
7 min read
Access Modifiers in JavaIn Java, access modifiers are essential tools that define how the members of a class, like variables, methods, and even the class itself, can be accessed from other parts of our program. They are an important part of building secure and modular code when designing large applications. In this article
6 min read
Arrays in JavaIn Java, an array is an important linear data structure that allows us to store multiple values of the same type. Arrays in Java are objects, like all other objects in Java, arrays implicitly inherit from the java.lang.Object class. This allows you to invoke methods defined in Object (such as toStri
9 min read
Java StringsIn Java, a String is the type of object that can store a sequence of characters enclosed by double quotes and every character is stored in 16 bits, i.e., using UTF 16-bit encoding. A string acts the same as an array of characters. Java provides a robust and flexible API for handling strings, allowin
8 min read
Regular Expressions in JavaIn Java, Regular Expressions or Regex (in short) in Java is an API for defining String patterns that can be used for searching, manipulating, and editing a string in Java. Email validation and passwords are a few areas of strings where Regex is widely used to define the constraints. Regular Expressi
7 min read
OOPs & Interfaces
Classes and Objects in JavaIn Java, classes and objects are basic concepts of Object Oriented Programming (OOPs) that are used to represent real-world concepts and entities. A class is a template to create objects having similar properties and behavior, or in other words, we can say that a class is a blueprint for objects.An
10 min read
Java ConstructorsIn Java, constructors play an important role in object creation. A constructor is a special block of code that is called when an object is created. Its main job is to initialize the object, to set up its internal state, or to assign default values to its attributes. This process happens automaticall
10 min read
Java OOP(Object Oriented Programming) ConceptsBefore Object-Oriented Programming (OOPs), most programs used a procedural approach, where the focus was on writing step-by-step functions. This made it harder to manage and reuse code in large applications.To overcome these limitations, Object-Oriented Programming was introduced. Java is built arou
10 min read
Java PackagesPackages in Java are a mechanism that encapsulates a group of classes, sub-packages and interfaces. Packages are used for: Prevent naming conflicts by allowing classes with the same name to exist in different packages, like college.staff.cse.Employee and college.staff.ee.Employee.They make it easier
8 min read
Java InterfaceAn Interface in Java programming language is defined as an abstract type used to specify the behaviour of a class. An interface in Java is a blueprint of a behaviour. A Java interface contains static constants and abstract methods. Key Properties of Interface:The interface in Java is a mechanism to
11 min read
Collections
Exception Handling
Java Exception HandlingException handling in Java is an effective mechanism for managing runtime errors to ensure the application's regular flow is maintained. Some Common examples of exceptions include ClassNotFoundException, IOException, SQLException, RemoteException, etc. By handling these exceptions, Java enables deve
8 min read
Java Try Catch BlockA try-catch block in Java is a mechanism to handle exceptions. This make sure that the application continues to run even if an error occurs. The code inside the try block is executed, and if any exception occurs, it is then caught by the catch block.Example: Here, we are going to handle the Arithmet
4 min read
Java final, finally and finalizeIn Java, the keywords "final", "finally" and "finalize" have distinct roles. final enforces immutability and prevents changes to variables, methods, or classes. finally ensures a block of code runs after a try-catch, regardless of exceptions. finalize is a method used for cleanup before an object is
4 min read
Chained Exceptions in JavaChained Exceptions in Java allow associating one exception with another, i.e. one exception describes the cause of another exception. For example, consider a situation in which a method throws an ArithmeticException because of an attempt to divide by zero.But the root cause of the error was an I/O f
3 min read
Null Pointer Exception in JavaA NullPointerException in Java is a RuntimeException. It occurs when a program attempts to use an object reference that has the null value. In Java, "null" is a special value that can be assigned to object references to indicate the absence of a value.Reasons for Null Pointer ExceptionA NullPointerE
5 min read
Exception Handling with Method Overriding in JavaException handling with method overriding in Java refers to the rules and behavior that apply when a subclass overrides a method from its superclass and both methods involve exceptions. It ensures that the overridden method in the subclass does not declare broader or new checked exceptions than thos
4 min read
Java Advanced
Java Multithreading TutorialThreads are the backbone of multithreading. We are living in the real world which in itself is caught on the web surrounded by lots of applications. With the advancement in technologies, we cannot achieve the speed required to run them simultaneously unless we introduce the concept of multi-tasking
15+ min read
Synchronization in JavaIn multithreading, synchronization is important to make sure multiple threads safely work on shared resources. Without synchronization, data can become inconsistent or corrupted if multiple threads access and modify shared variables at the same time. In Java, it is a mechanism that ensures that only
10 min read
File Handling in JavaIn Java, with the help of File Class, we can work with files. This File Class is inside the java.io package. The File class can be used to create an object of the class and then specifying the name of the file.Why File Handling is Required?File Handling is an integral part of any programming languag
6 min read
Java Method ReferencesIn Java, a method is a collection of statements that perform some specific task and return the result to the caller. A method reference is the shorthand syntax for a lambda expression that contains just one method call. In general, one does not have to pass arguments to method references.Why Use Met
9 min read
Java 8 Stream TutorialJava 8 introduces Stream, which is a new abstract layer, and some new additional packages in Java 8 called java.util.stream. A Stream is a sequence of components that can be processed sequentially. These packages include classes, interfaces, and enum to allow functional-style operations on the eleme
15+ min read
Java NetworkingWhen computing devices such as laptops, desktops, servers, smartphones, and tablets and an eternally-expanding arrangement of IoT gadgets such as cameras, door locks, doorbells, refrigerators, audio/visual systems, thermostats, and various sensors are sharing information and data with each other is
15+ min read
JDBC TutorialJDBC stands for Java Database Connectivity. JDBC is a Java API or tool used in Java applications to interact with the database. It is a specification from Sun Microsystems that provides APIs for Java applications to communicate with different databases. Interfaces and Classes for JDBC API comes unde
12 min read
Java Memory ManagementJava memory management is the process by which the Java Virtual Machine (JVM) automatically handles the allocation and deallocation of memory. It uses a garbage collector to reclaim memory by removing unused objects, eliminating the need for manual memory managementJVM Memory StructureJVM defines va
4 min read
Garbage Collection in JavaGarbage collection in Java is an automatic memory management process that helps Java programs run efficiently. Java programs compile to bytecode that can be run on a Java Virtual Machine (JVM). When Java programs run on the JVM, objects in the heap are created, which is a portion of memory dedicated
7 min read
Memory Leaks in JavaIn programming, a memory leak happens when a program keeps using memory but does not give it back when it's done. It simply means the program slowly uses more and more memory, which can make things slow and even stop working. Working of Memory Management in JavaJava has automatic garbage collection,
3 min read
Practice Java
Java Interview Questions and AnswersJava is one of the most popular programming languages in the world, known for its versatility, portability, and wide range of applications. Java is the most used language in top companies such as Uber, Airbnb, Google, Netflix, Instagram, Spotify, Amazon, and many more because of its features and per
15+ min read
Java Programs - Java Programming ExamplesIn this article, we will learn and prepare for Interviews using Java Programming Examples. From basic Java programs like the Fibonacci series, Prime numbers, Factorial numbers, and Palindrome numbers to advanced Java programs.Java is one of the most popular programming languages today because of its
8 min read
Java Exercises - Basic to Advanced Java Practice Programs with SolutionsLooking for Java exercises to test your Java skills, then explore our topic-wise Java practice exercises? Here you will get 25 plus practice problems that help to upscale your Java skills. As we know Java is one of the most popular languages because of its robust and secure nature. But, programmers
7 min read
Java Quiz | Level Up Your Java SkillsThe best way to scale up your coding skills is by practicing the exercise. And if you are a Java programmer looking to test your Java skills and knowledge? Then, this Java quiz is designed to challenge your understanding of Java programming concepts and assess your excellence in the language. In thi
1 min read
Top 50 Java Project Ideas For Beginners and Advanced [Update 2025]Java is one of the most popular and versatile programming languages, known for its reliability, security, and platform independence. Developed by James Gosling in 1982, Java is widely used across industries like big data, mobile development, finance, and e-commerce.Building Java projects is an excel
15+ min read