Java Tutorial

Java Tutorial Java Features C++ vs Java Java History Java Hello World Java Development Kit Java Runtime Environment Java Virtual Machine Difference between JDK, JRE, and JVM Memory Areas in Java Java Operators Java Keywords Primitive Data Types Variables

Java Loops

Java Do While Loop Java While Loop Java For Loop Java Enhanced For Loop

Java Programs

Java Basic Programs Factorial Program in Java Fibonacci Series Program in Java Prime Number Program in Java Palindrome Number Program in Java Armstrong Number Program in Java Anagram Program in Java Pattern Programs in Java Calculator Program in Java Leap Year Program in Java Addition Program in Java Number Pattern Programs in Java Star Pattern Programs in Java Package Program in Java Pyramid Program in Java Sorting Program in Java String Palindrome Program in Java Even Odd Program in Java For Loop Program in Java If Else Program in Java Switch Case Program in Java GCD Program in Java LCM Program in Java Hello Program in Java Matrix Program in Java Menu Driven Program in Java Series Program in Java Client Server Program in Java Swapping Program in Java Pig Latin Program in Java Tower of Hanoi Program in Java Recursion Program in Java Matrix Multiplication Program in Java Perfect Number Program in Java Classes and Objects in Java Example Programs String Programs in Java Array Programs in Java Constructor Program in Java Inheritance Program in Java Abstract class Program in Java Interface Program in Java Encapsulation Program in Java Polymorphism Program in Java Exception Handling Program in Java Multithreading Program in Java Thread Program in Java Collection Programs in Java ArrayList Program in Java Stack Program in Java Applet Program in Java Swing Program in Java JDBC Program in Java How to run Java program in command prompt How to run Java program in Eclipse

Java Sorting

Sorting Algorithms in Java Merge Sort in Java Quick Sort in Java Bubble Sort in Java Insertion Sort in Java Selection Sort in Java Heap Sort in Java Radix Sort in Java Topological Sort in Java Bucket Sort in Java Counting Sort in Java

Java OOPs Concepts

OOPs - Object Oriented Programming Objects and Classes in Java Java Naming Conventions Constructors in Java Java this keyword Java static keyword Inheritance in Java Aggregation in Java Java super keyword Constructor Chaining and Constructor Overloading Java Polymorphism Static and Dynamic Binding in Java Java Abstraction Abstract class in Java Interface in Java Difference between Abstract class and Interface Java final keyword Packages in Java Access Modifiers in Java Java Wrapper classes Java Numbers Java Characters Java Integer Java Boolean Java Arrays Java Command Line Arguments Java strictfp Keyword Java Math

Java Strings

Java Strings Java String Methods StringBuilder in Java StringBuffer in Java Java Regular Expressions StringBuffer vs StringBuilder String vs StringBuffer String vs StringBuilder String Manipulation in Java Java String Concatenation How to Reverse a String in Java String Array in Java How to Compare Two Strings in Java How to Concatenate Two Strings in Java Why String in Immutable in Java java.lang.NumberFormatException for Input String String Pool in Java Java Generate Random String How to take String Input in Java Java String Interview Questions

Java Exceptions

Exception Handling in Java Java try catch Java throw Java throws Difference between throw and throws Java finally Java Custom Exception Java Exception Propagation

Garbage Collection

Automatic Resource Management in Java Java Garbage Collection Java finalize() Java gc() Difference between final, finally and finalize


Multithreading in Java Process and Thread in Java Basic Terms in Multithreading Java Thread creation Thread Scheduler in Java Java Thread class DeadLock in Java

Java IO

Java IO Java Read File Java BufferedWriter Java InputStreamReader Java File Java Read File Line By Line Java FileOutputStream Jar File in Java


Java Serialization Java transient


Java Network Programming Java Socket Programming Java URL Java URLConnection HttpURLConnection in Java Java InetAddress Java DatagramSocket and Java DatagramPacket


Java AWT


Swing in Java

Java Collections

Collections in Java Java List Interface ArrayList in Java LinkedList in Java Vector in Java Stack in Java ArrayList vs LinkedList in Java ArrayList vs Vector in Java Java Set Interface HashSet in Java LinkedHashSet in Java TreeSet in Java Java Queue Interface PriorityQueue in Java ArrayDeque in Java Java Map Interface HashMap in Java LinkedHashMap in Java TreeMap in Java Dictionary in Java Hashtable in Java Properties in Java Collections class in Java Java Comparable Java Comparator Comparable vs Comparator in Java

Java Generics

Generics in Java

Java Annotations

Annotations in Java


Java JDBC Tutorial

Java Differences

Java vs JavaScript Python vs Java Kotlin vs Java Java vs C++ C# vs Java Static vs Non-static in Java C vs Java int vs Integer in Java Stack vs Heap in Java Java Array vs ArrayList

How to

How to run Java program How to set path in Java How to check the Java version in cmd How to install Java in Windows 10 How to run Java program in cmd How to call a method in Java How to sort an array in Java How to iterate HashMap in Java How to write Java program How to create an array in Java How to create a package in Java How to generate random numbers in Java How to input String in Java How to create thread in Java How to find length of String in Java How to sort a string in Java How to use scanner in Java How to achieve multiple inheritance in Java How to run Java program in Eclipse How to call a function in Java How to create array of objects in Java How to create custom exception in Java How to achieve abstraction in Java How to call static method in Java

Java 8 Features

Java 8 Features Lambda Expressions in Java Functional Interface in Java Streams in Java Java Base64 Encoding and Decoding Parallel Arrays Sort in Java

Java 9 Features

Java 9 Tutorial Java 9 Try With Resources Java 9 Interface Private Method

Java Servlet Tutorial

Java Servlets Tutorial

Java JSP Tutorial

Java JSP Tutorial

Hibernate Tutorial

Hibernate Tutorial

Spring Tutorial

Spring Tutorial

Spring MVC Tutorial

Spring MVC Tutorial

Jenkins Tutorial

Jenkins Tutorial

Java Math Methods

Math.abs() Math.acos() Math.addExact() Math.asin() Math.atan () Math.atan2() Math.cbrt() Math.ceil() Math.copysign() Math.cos() Math.cosh() Math.decrementExact() Math.exp() Math.expm1() Math.floor() Math.floorDiv() Math.floorMod() Math.getExponent() Math.hypot() Math.IEEEremainder() Math.incrementExact() Math.log() Math.log10() Math.log1p() Math.max() Math.min() Math.multiplyExact() Math.multiplyFull() Math.negateExact() Math.nextAfter() Math.nextDown() Math.nextUp() Math.pow() Math.random() Math.rint() Math.round() Math.scalb() Math.signum() Math.sin() Math.sinh() Math.sqrt() Math.subtractExact() Math.tan() Math.tanh() Math.toDegrees() Math.toIntExact() Math.toRadians() Math.ulp()

Java String Methods

toCharArray() copyValueOf() endsWith() equals() equalsIgnoreCase() format() getBytes() getChars() hashCode() indexOf() intern() isEmpty() join() lastIndexOf() length() replace() replaceAll() replaceFirst() split() startsWith() subSequence() substring() toLowerCase() toUpperCase() trim() valueOf()

Java Conversion

Java Convert String to int Java Convert int to String Java Convert String to long Java Convert long to String Java Convert String to float Java Convert float to String Java Convert String to double Java Convert double to String Java Convert String to Date Java Convert Date to String Java Convert String to Object Java Convert Object to String Java Convert String to char Java Convert char to String Java Convert int to long Java Convert long to int


Functional Interfaces in Java Singleton class in Java Awesome explanation of Strings in Java Object class in Java Static class in Java All the important string methods in Java String Handling Method in Java What are Array strings in Java Advantages and Disadvantages of Strings in Java Big Decimal class in Java Class definition in Java Char and String differences in Java Difference between String, StringBuffer and StringBuilder in java Replace character in string Java String Coding Interview Questions in Java What is String in Java? String isnullorempty in Java String Matches in Java Trim Method in String Java Bean class in Java Libraries in Java Arithmetic Operations on String in Java Convert Char array to string in java Check whether Java is installed or not How to calculate time difference in Java How to stop execution after a certain time in Java Jagged Array in Java Java ArraylistRemove() Time Complexity Java Swing Time Picker Zigzag Array in Java

Multithreading in Java

Multithreading is a specialized form of multitasking. It is responsible for executing more than one task at a time of a single program, and each task is a separate thread. A program that is multithreaded consists of two or more parts that can run concurrently, and each part can handle a different task. The multithreading is a technique for making optimal or better use of the available resources, especially when our computer has multiple CPUs. Multi-threading enhances the idea of multitasking into applications where we can distribute specific operations within a single application into individual threads. The threads can run in parallel in a single process. The OS distributes processing time not only among different program but also among each thread within a program.

It enables us to write in a way where multiple activities can proceed concurrently in the same program.

The main important application areas of multithreading are

  1. To develop multimedia graphics.
  2. To develop animations.
  3. To develop video games.
  4. To develop web server and applications server setup.

Note: when compared with the old languages developing multithreaded applications in java is very easy because java provides inbuilt support for multithreading by having a rich API.

What are the types of Thread?

Two types of Threads that are created in the system.    

  • Kernel Level Threads.
  • User Level Threads.

Kernel Level Threads

The concurrency has become cheaper(fast) because a process has multiple threads that are executed its multiple jobs at a time. As such, the OS manages these threads and processes. The kernel implements all the thread operations, and the OS schedules all threads in the kernel. The OS managed threads are called kernel-level threads or light- weight processes.

A kernel thread is a schedulable entity, which means that the system scheduler(kernel) handles kernel threads. These threads are strongly implementation-dependent and known by the system scheduler.

A kernel thread is a kernel entity, such as processes and interrupts handlers; it is the entity controlled by the system scheduler. A kernel thread runs within a process but can be referenced by another thread in the system. There is no direct control over these threads by the programmer. The libraries provide user threads for facilitating the writing of portable programs.

The management of the threads is performed by the kernel because it is having the information of the threads. There is no need for a runtime system in the case of kernel management. The kernel contains a thread table that keeps track of the threads in the system rather than it has the thread table in every process. Besides, the kernel also has the traditional process table for keeping the processes track. The creation and management of the threads are by the system calls of the kernel.

The context information for the process, as well as the process threads, is all managed by the kernel. Because of this, kernel-level threads are slower than user-level threads.

 Kernel-Level Threads advantages:

  1. The scheduler decides to give more time to a process consisting of a large number of threads than process having a small number of threads because the kernel has full knowledge of all threads.
  2. On the different processors in kernel-level threads, multiple threads of the same process can be scheduled.
  3. Multithreaded environments can also be applied to the kernel routines.
  4. Kernel-level threads are considered better, especially for applications that frequently block.
  5. The kernel can schedule the rest of the threads of the same process if a kernel-level thread is blocked.

kernel-level Threads disadvantages:

  1. The Kernel-level threads are inefficient and slower to create as well as manage as compared to user-level threads. The operations of the kernel threads are hundreds of times slower than that of user-level threads.
  2. There is significant overhead and increased kernel complexity because it manages and schedules threads as well as processes and also maintains a full thread control block (TCB) for each thread to maintain information about threads.                             

User Level Threads  

Kernel-Level threads make concurrency much cheaper because much less state to allocate and initialize. However, for fine-grained concurrency, kernel-level threads still suffer from too much overhead. Thread operations still require system calls. Ideally, we require thread operations to be as fast as possible as procedure calls. Kernel-Level threads have to be general to support the needs of all programmers, languages, runtimes, etc. For such fine-grained concurrency, we need still cheaper threads which perform operations as fast as possible.

So, to make threads cheap and fast, they need to be implemented at the user level. User-level threads are small and much a hundred times faster than kernel-level threads. The run-time system (user-level library) manages the User-Level threads entirely. Creating a new thread, switching between threads, and synchronizing threads are done via a procedure call, i.e., there is no involvement of kernel. The kernel does not know about user-level threads and only manages(handle) them in last (i.e., to execute them) as if they were single-threaded processes.

Within a program to handle multiple control flow, a user thread is an entity used by programmers. The API for handling user threads is provided by the thread library. A user thread exists only within a process; User thread in process A cannot refer to user thread in process B. The library uses a proprietary interface to handle kernel threads to execute user threads. The user threads API is a part of a POSIX-standards complaint portable-programming model, unlike the kernel threads interface. Thus, a multithreaded program created on an AIX system can be easily ported to other systems. On the other systems, User threads are called threads, and the lightweight process refers to kernel threads.

 User-Level Threads advantages:

  1. On an operating system, the user-level threads can be implemented.
  2. Each thread is represented by a PC, registers, stack, and a small control block, all stored in the user process address space.
  3. A thread creation, threads switching, and thread- synchronization can all be done without the intervention of the kernel.
  4. To create the User-level threads are easier and faster than kernel-level threads.
  5. On the operating system, User-level threads can be run.
  6. For thread switching in user-level threads, there are no kernel-mode privileges required.

 User-Level Threads disadvantages:

  1. As the User-Level threads are not well integrated with the OS, so threads are invisible to it. Due to this, OS performs poor decisions like process scheduling with idle threads, process blocking whose thread initiated an I/O even though the process has the threads that can run and un-scheduling a process with a thread holding a lock.
  2. There is a lack of coordination(communication) between the operating system kernel and threads. As a result, the whole process gets a one-time slice irrespective of whether the process has one thread or 1000 threads in it.
  3. Non-blocking systems call required by the User-level threads.  The entire process will be blocked in the kernel else, even if there are runnable threads left in the processes.
  4. Multithreaded applications in user-level threads cannot use multiprocessing to their advantage.
  5. The entire process is blocked if one user-level thread performs blocking operation.

What is the difference between User-Level and Kernel-Level thread?

User-Level ThreadKernel-Level Thread
These threads are faster to manage and create.These threads are slower to create and manage.
Context switch time is less.Context switch time is more.
If one user-level thread performs blocking operation, then the entire process will be blocked.If one kernel thread performs blocking operation, then another thread can continue execution.
The operating system does not recognize user-level threads.The operating system recognizes kernel threads.
Multi-threaded applications cannot take advantage of multiprocessing.Kernel routines themselves can be multithreaded.
The user-level thread can run on any operating system.Kernel-level thread is not generic and relates to a specific operating system.
The user thread utilizes a thread library at the user level.The operating system supports the creation of kernel threads.

What are the Multithreading models?

To increase multiprogramming or increase the efficiency of the systems, we are using multithreading models.

There are three types of multithreading models:


Many user-level threads are mapped to one single kernel thread. One kernel thread is responsible for handling the operation of the many user-level threads.

Thread management is done in user-space that means the creation of thread and managing the thread is done in the user-space.

Multithreading in Java

If anyone user thread makes blocking calls or is blocked due to some reason so the entire operation is blocked, and the kernel thread also gets blocked because of that one user thread. For example, while executing, a process a thread ends up reading some invalid memory locations, the thread makes a blocking call, and kernel thread also gets blocked due to this user thread.


For every user thread, there is a kernel thread. Whatever user thread is created for each user thread, a kernel will also create a kernel thread, so each user thread is mapped to a kernel thread.                                                 

It provides more concurrency. If one thread makes a blocking call, the remaining another thread is allowed to run the application or the process for completing the task with the remaining kernel threads.

Multithreading in Java2

This model increases the concurrency, but it increases the overhead to the operating system for creating the corresponding kernels for the corresponding user threads. For managing the users’ threads, the operating system has to create many kernel threads. So one-to-one overloads or burdens the operating system by creating many kernel threads for each user threads. Creating a kernel thread may not be possible after a point as managing these kernel threads will again be the overhead for the operating system.


It multiplexes many user-level threads to a smaller or equal number of kernel threads. One kernel thread will be associated with one or more user threads. In this model, even if one or more user threads are blocked, the other kernel threads will manage the user threads and executes the task or continuing executing the task.

Multithreading in Java3

The user threads are multiplexed with the kernel thread, so one kernel thread may be handling more than one user thread. In that case, even if one user thread makes a blocking call, the other user threads may be handled over the other kernel threads, and the execution continues to run.

So, here scheduling of threads is done so the kernel is scheduled a thread for execution, so if one user thread makes a blocking call to one kernel thread so the remaining user threads will be scheduled for the other kernel threads. The Many-to-Many model provides more concurrency as compared to the previous two models, and it is considered the best model for multithreading.