In Java, Virtual threads are now supported by the Java Platform. Virtual threads are lightweight threads that greatly minimize the effort required to create, operate, and manage high volumes systems that are concurrent. As a result, they are more efficient and scalable than standard platform threads.
A thread is the smallest processing unit that can be scheduled. It operates concurrently with, and mostly independently of other units of this type. It's an instance of java.lang.Thread.
There are two kinds of threads, platform threads and virtual threads:
- Platform Threads
- Virtual Threads
1. Platform Threads
Operating system (OS) threads are implemented with a platform thread acting as a thin wrapper around them. Java code is executed by a platform thread on its parent OS thread, and the platform thread captures its OS thread for the length of its lifetime.
As a result, there can only be an equal number of OS threads and platform threads.
The operating system usually maintains a large thread stack and additional resources for platform threads. They may be in short supply, but they are suitable for executing many kinds of work.
2. Virtual Threads
A virtual thread is an instance of java.lang.Thread, independent of any OS thread, is used to run programs. The Java runtime suspends the virtual thread until it resumes when the code calls a blocked I/O operation. Virtual threads have a limited call stack and can only execute one HTTP client call or JDBC query. They are suitable for delayed operations, but not for extended CPU-intensive tasks.
Syntax of Virtual Threads:
Thread virtualThread = Thread.ofVirtual().start(() -> {
// Code to be executed by the virtual thread
});
Why Use Virtual Thread?
In your high quantities concurrent applications, use virtual threads if you have many concurrent processes that take a long time to finish. Server applications often handle large numbers of client requests, which requires blocking I/O tasks such as resource access. This makes server applications high-throughput.
Virtual threads do not execute code more quickly than platform threads. Their goal is to provide scale (greater throughput) rather than speed (lower latency).
Advantages of Java Virtual Threads:
There are various advantages to using virtual threads:
- Increases the availability of applications
- Enhances application throughput.
- Reduces the occurrence of 'OutOfMemoryError: Unable to Create New Native Thread'.
- Reduces the amount of memory used by the application
- Enhances code quality
- Platform Threads are completely compatible with them.
How To Create A Virtual Thread?
Platform and virtual thread creation is possible with the Thread and Thread.Builder APIs. The methods to build an ExecutorService that launches a new virtual thread for each operation are also defined in the java.util.concurrent.Executors class.
1. Using the Thread Class and the Thread.Builder Interface to Create a Virtual Thread
Create a version of Thread.Builder using the Thread.ofVirtual() function to build virtual threads.
The following example creates and opens a virtual thread that outputs a message. To wait for the virtual thread to finish its work, it calls the join method. You can see the written message before the main thread ends by doing this.
Thread thread = Thread.ofVirtual().start(() -> System.out.println("Hello"));
thread.join();
You can create threads with standard Thread properties, such as the thread name, using Thread.Builder. While Thread.Builder.OfVirtual creates virtual threads, Thread.Builder.OfPlatform creates platform threads.
The given code starts and opens a virtual thread called "MyThread," prints a message while it's operating, and then uses t.join() to wait for the thread to finish. You can follow these steps to a similar program:
Java
// Java program to demonstrate exchange
// Data between threads using scoped values
import java.util.*;
//Driver class
public class VirtualThreadExample {
// main function
public static void main(String[] args) {
try {
// Initialization of thread
Thread.Builder builder = Thread.ofVirtual().name("GFG Thread");
Runnable task = () -> {
System.out.println("Running thread");
};
Thread t = builder.start(task);
System.out.println("Thread t name: " + t.getName());
// Add a delay to allow the virtual thread to run
// Sleep for 1 second
Thread.sleep(1000);
// Wait for the thread to complete
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Output:
Running thread
Thread t name: GFG Thread
Explanation of the above program:
- Using Thread.ofVirtual().name("MyThread"), we establish a virtual thread.
- Start the thread with a basic Runnable job that outputs "Running thread."
- We use t.getName() to print the thread's name after it has been started.
- To wait for the thread to finish, we use t.join().
- Any InterruptedException that might be generated while the thread is running is identified by us.
This software will launch a virtual thread, carry all the task, print the thread name, and then wait for the thread to terminate.
2. Creating and executing a virtual thread with the Executors.newVirtualThreadPerTaskExecutor() Method
You can separate the creation and management of threads from other software components by using executors.
The Executors.newVirtualThreadPerTaskExecutor() function is used in the example below to build the ExecutorService. To complete the work, a new virtual thread is generated and launched when you use ExecutorService.submit(Runnable). A Future instance is returned by this method. It's important to note that the Future.get() function waits for the thread to complete its task.
The code below code submits a basic task that prints a message and then uses future to wait for the task to finish using an ExecutorService with a virtual thread per task.fetch(). It prints "GeeksForGeeks" to signify that the task has been finished after it is finished.
This Java program represents the behavior in question:
Java
// Java Program for Creating and executing
// Virtual thread with the
// Executors.newVirtualThreadPerTaskExecutor() Method
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class VirtualThreadExecutorExample {
public static void main(String[] args) {
try (ExecutorService myExecutor = Executors.newVirtualThreadPerTaskExecutor()) {
// Submit a task that prints a message
Future<?> future = myExecutor.submit(() -> System.out.println("Running thread"));
// Wait for the task to complete
future.get();
System.out.println("Program Completed !!");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
Output:
Running thread
Program Completed !!
Explanation of the above program:
- We use virtual threads with executors to develop an executor service.virtualThreadPerTaskExecutor() is created.
- We submit a basic task that uses myExecutor to print "Running thread".submit(...) and take note of the Future object that the submission has returned.
- We employ future.get() to pause when the job is finished. This will keep blocking till the job is completed.
- "GeeksForGeeks" is printed to show that the task has been finished after it is finished.
- To handle any exceptions that might arise, we catch ExecutionException and InterruptedException.
Multithreaded Client Server
The example that follows has two classes. A server application called EchoServer listens on a specific port and launches a fresh virtual thread with each new connection. A client application called EchoClient establishes a connection with the server and transmits commands submitted via the command line.
EchoClient connects to EchoServer via establishing a socket. It receives user input via the standard input stream, reads it, and writes the text to the socket to send it to EchoServer.The input is transmitted back to the EchoClient by the EchoServer over the socket. EchoClient receives data from the server and reads and shows it.
- With virtual threads one for each client connection - EchoServer can serve numerous clients at once.
Below is the implementation of the above-mentioned topic:
Java
// Java Program to implement
// Multithreaded Client Server
import java.io.*;
import java.net.*;
//Driver class
public class EchoServer {
//Main method
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: java EchoServer <port>");
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
System.out.println("EchoServer listening on port " + portNumber);
while (true) {
Socket clientSocket = serverSocket.accept();
// Accept incoming connections
// Start a service thread
Thread.ofVirtual().start(() -> {
try (
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received: " + inputLine);
out.println("Echo: " + inputLine);
out.flush(); // Explicitly flush the output
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port " + portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
Output:
Usage: java EchoServer <port>
What is the performance impact of Virtual threads?
Platform threads are much heavier than Java virtual threads. More details about Java virtual threads' impact on performance may be found here. However, to describe it briefly:
- Looking for virtual threads will save memory if your program uses a lot of threads or a large stack size.
- By using virtual threads instead of thread pools when your application often generates new threads, you can improve response time.
Similar Reads
Java Tutorial Java is a high-level, object-oriented programming language used to build web apps, mobile applications, and enterprise software systems. It is 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).Java 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