Java Multithreading Tutorial in depth with Example

In the previous tutorial, we learned the basic concept of thread in Java. Now, we will learn multithreading in Java with realtime examples in depth.

We know that Java is a multithreaded programming language which means we can develop multithreaded program using Java.

Multithreading programming approach is one of the most powerful features of Java. To grasp the concept of multithreading, one has to understand the meaning of multithreading.

Multithreading means multiple threads of execution concurrently. The process of executing multiple threads simultaneously (concurrently) is called multithreading in Java.

In other words, multithreading is a technique or programming concept in which a program (process) is divided into two or more subprograms (subprocesses), each of which can perform different tasks simultaneously (at the same time and in parallel manner). Each subprogram of a program is called thread in Java. 

When a program contains more than one thread, the CPU can switch between two threads to execute them at the same time. The switching between two threads is known as context switch.

The switching from one thread to another thread occurs so fast that it appears to the users that all threads are being executed at the same time. But in reality, only one thread is executed at a time.  


This technique is useful for those applications which need multiple tasks to be done simultaneously. Multithreading improves the performance of CPU by maximum utilization and keeping the idle time of CPU to minimum. 

In a multithreaded program, each thread is assigned a single task to perform and executes independently. If an exception occurs in one thread, it does not affect other threads during the execution. 

For example, one thread read data, another thread process it, and third thread write it, thus improves the overall performance of an application.

We can write a multithreaded program to display animations, to play music, and download a file from the network at the same time. 

Advantage of Multithreading in Java


The advantages of using multithreading programming concept are as follows:

1. In a multithreaded application program, different parts of the application are executed by different threads. The entire application does not stop even if an exception occurs in any of the threads. It does not affect other threads during the execution of the application.

2. Different threads are allotted to different processors and each thread is executed in different processors in parallel.
3. Multithreading helps to reduce computation time.
3. Multithreading technique improves the performance of application.
4. Threads share the same memory address space. Hence, it saves memory.
5. Multithreaded program makes maximum utilization of CPU and keeping the idle time of CPU to minimum.
6. Context switching from one thread to another thread is less expensive than between processes. 

Drawbacks of Multithreading in Java


The drawbacks of multithreading are as follows:
1. Increased complexity.
2. Synchronization of shared resources.
3. In the multithreading programming concept, debugging is difficult. At times, result is unpredictable.
4. Potential deadlocks.
5. Programming complications may occur. 

Multitasking in Java


The process of executing one or more tasks concurrently or at the same time is called multitasking. It is the ability of an operating system to execute multiple tasks at once. The main purpose of multitasking is to use the idle time of CPU.


Multitasking can be implemented in two ways:
1. Process-based multitasking (Multiprocessing)
2. Thread-based multitasking (Multithreading)

Process-based Multitasking (Multiprocessing)


The process of executing multiple programs or processes at the same time (concurrently) is called process-based multitasking or program-based multitasking. In process-based multitasking, several programs are executed at the same time by the microprocessor.

Therefore, it is also called multiprocessing in Java. It is a heavyweight. A process-based multitasking feature allows to execute two or more programs concurrently on the computer.

A good example is, running spreadsheet program while also working with word-processor.

Each program (process) has its own address space in the memory. In other words, each program is allocated in a separate memory area.

The operating system requires some CPU time to switch from one program to another program. The switching of CPU among programs is called context switching.

The switching from one program to another program is so fast that it appears to the user that multiple tasks are being done at the same time. 

Thread-based Multitasking (Multithreading)


A thread is a separate path of execution of code for each task within a program. In thread-based multitasking, a program uses multiple threads to perform one or more tasks at the same time by a processor. That is, thread-based multitasking feature allows you to execute several parts of the same program at once. Each thread has a different path of execution.

Realtime Example of Multithreading in Java


Let’s take different examples of thread-based multithreading in Java.

1. A very good example of thread-based multithreading is a word processing program that checks the spelling of words in a document while writing the document. This is possible only if each action is performed by a separate thread.

2. Another familiar example is a browser that starts rendering a web page while it is still downloading the rest of page.

Consider a program as shown in the below figure. The program is divided into two parts. These parts may represent two separate blocks of code or two separate methods that can perform two different tasks of the same program.Thread based multitasking (Multithreading) in Java

Hence, a processor will create two separate threads to execute these two parts simultaneously. Each thread acts as an individual process that will execute a separate block of code. Thus, a processor has two threads that will perform two different tasks at a time. This multitasking is called thread-based multiple tasking.

Advantage of Thread-based Multitasking over Process-Thread Multitasking


The main advantages of thread-based multitasking as compared to process-based tasking are
1. Threads share the same memory address space.
2. Context switching from one thread to another thread is less expensive than between processes.
3. The cost of communication between threads is relatively low.

4. Threads are lightweight as compared to processes (heavyweight). They utilize the minimum resources of the system. They take less memory and less processor time.

Java supports thread-based multitasking and provides a high quality of facilities for multithreading programming.

Final words
A great way to remember the difference between process-based multitasking and thread-based multitasking is process-based multitasking works with multiple programs or processes whereas thread-based multitasking works with parts of one program.

In process-based multitasking, a program is the smallest unit of executable code whereas, in thread-based multitasking, thread is the smallest unit of executable code.
Thanks for reading!!!