Tutorial

Multithreading in Java - Everything You MUST Know

Published on August 3, 2022
author

Pankaj

Multithreading in Java - Everything You MUST Know

When we run a real-world application, we use good processors for faster execution. But, only processor speed can’t make your application run fast. One of the great ways to create a performance efficient application is use utilize multithreading.

What is Multithreading?

Multithreading is a programming concept in which the application can create a small unit of tasks to execute in parallel. If you are working on a computer, it runs multiple applications and allocates processing power to them. A simple program runs in sequence and the code statements execute one by one. This is a single-threaded application. But, if the programming language supports creating multiple threads and passes them to the operating system to run in parallel, it’s called multithreading.

Multithreading vs Multiprocessing

When we talk about multithreading, we don’t care if the machine has a 2-core processor or a 16-core processor. Our work is to create a multithreaded application and let the OS handle the allocation and execution part. In short, multithreading has nothing to do with multiprocessing.

How does Java Support Multithreading?

Java has great support for multithreaded applications. Java supports multithreading through Thread class. Java Thread allows us to create a lightweight process that executes some tasks. We can create multiple threads in our program and start them. Java runtime will take care of creating machine-level instructions and work with OS to execute them in parallel.

What are the different types of threads?

There are two types of threads in an application - user thread and daemon thread. When we start an application, the main is the first user thread created. We can create multiple user threads as well as daemon threads. When all the user threads are executed, JVM terminates the program.

What is Thread Priority?

When we create a thread, we can assign its priority. We can set different priorities to different Threads but it doesn’t guarantee that a higher priority thread will execute first than a lower priority thread. The thread scheduler is the part of Operating System implementation and when a Thread is started, its execution is controlled by Thread Scheduler and JVM doesn’t have any control over its execution.

How Do we Create Thread in Java?

We can create Threads by either implementing Runnable interface or by extending Thread Class.

Thread t = new Thread(new Runnable(){
    @Override
    public void run() {
    }
});

Above is a one-line statement to create a new Thread. Here we are creating a Runnable as an anonymous class. If you are familiar with lambda expressions, we can create a Thread with much shorter code.

Runnable runnable = () -> System.out.println("Hello");

Once we have created a Thread, we have to start its execution by calling the start() method.

runnable.start();

I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.

1. Java Thread and Runnable

This is the first post about the Thread class and Runnable interface. You will also learn about Process and Thread. What is the difference between Thread and Process? Benefits of using Threads and how we can create Threads using Runnable interface and Thread class. This post also compares the Runnable interface with the Thread class.

2. Java Thread Sleep

Java Thread sleep is used to pause the execution of the current thread. We will use Thread sleep extensively in future posts, so it’s good to know how it works and is it accurate or not?

3. Java Thread Join

Sometimes we need to wait for other threads to finish their execution before we can proceed. We can achieve this using the Thread join method, learn how it works and when we should use it.

4. Java Thread States

Understanding different states of thread are important. Learn how a thread changes its state and how the operating system thread scheduler changes the state of a thread.

5. Java Thread wait, notify and notifyAll

Java Object class contains three methods to communicate the lock status of a resource. Learn with example usage of these Object class methods in a simple Wait-Notify implementation.

6. Thread Safety and Synchronization

We know that Threads share Object resources, which can lead to data corruption because these operations are not atomic. Learn how we can achieve thread-safety in java using different methods. Read this post to learn about the correct usage of synchronization, synchronized methods, and synchronized blocks.

7. Java Exception in thread main

JVM creates the first thread using the main method. This post explains some common exceptions we see in daily life and what is the root cause of them and how to fix them.

8. Thread Safety in Singleton Class

In this article, you will learn basic concepts of creating a Singleton class. What are thread safety issues with different implementations? How we can achieve thread-safety in Singleton class.

9. Daemon Thread in Java

A simple article explaining daemon threads and how we can create daemon threads in java.

10. Java Thread Local

We know that threads share Object’s variables but what if we want to have thread-local variables created at the class level. Java provides the ThreadLocal utility class to create thread-local variables. Read more to learn about how we can create ThreadLocal variables in the java program.

11. Java Thread Dump

Java Thread dump provides the information of the current thread. A thread dump is useful to analyze performance issues with the application. You can use thread dump to find and fix deadlock situations. This post explains different methods that can be used to generate thread dumps in java.

12. How to Analyze Deadlock in Java

Deadlock is a situation where multiple threads are waiting for each other to release resources causing cyclic dependency. This article discusses the situation in which we can get deadlock in a java program. How we can use Thread dump to find the deadlock and best practices to avoid deadlock in java program.

13. Java Timer Thread

This post explains how we can use Java Timer and TimerTask classes to create jobs to run at a scheduled interval, an example program showing its usage, and how we can cancel the timer.

14. Java Producer Consumer Problem

Before Java 5, the producer-consumer problem can be solved using wait() and notify() methods but the introduction of BlockingQueue has made it very easy. Learn how we can use BlockingQueue to solve the producer-consumer problem in java.

15. Java Thread Pool

Java Thread Pool is a collection of worker threads waiting to process jobs. Java 5 introduction of the Executor framework has made it very easy to create a thread pool in java. We can use Executors and ThreadPoolExecutor classes to create and manage a thread pool.

16. Java Callable Future

Sometimes we want our Thread to return some values that we can use. Java 5 Callable can be used in that case, which is similar to the Runnable interface. We can use the Executor framework to execute Callable tasks.

17. Java FutureTask Example

FutureTask class is the base concrete class that implements the Future interface. We use it with Callable implementation and Executors for asynchronous processing. The FutureTask class provides implementation methods to check the state of the task and return the value to the calling program once its processing is finished. It comes in handy when you want to override some of the implementation methods of the Future interface.

Conclusion

Multithreading is a very broad topic and writing everything about it in a single post wouldn’t have been possible. If you go through the above posts in sequence, you will learn everything about multithreading in Java.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Pankaj

author

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
September 11, 2013

Please can you tell me how to print the Future values as in Example 16(Callable task) in example 17(FutureTask )?

- Mohamed

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    November 6, 2013

    Very helpful post. Can you post locks concept in Threads.

    - Tan

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      June 5, 2014

      Sir i want program definitions list in core java.

      - keval patel

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        August 13, 2014

        it has given me a use full tips for me and it helped me to understand

        - Gitanjali

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          September 6, 2014

          HI, I have tried to run Java thread example, but its run method is not calling. I just created MyThread and HeavyRunnable class through eclipse editor and add extends and implements Runnable by hand. Any issue. Thanks.

          - Sikander Rafiq

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            August 4, 2015

            Hi Sir, There was a spelling mistake at ( of ) in the below line, please change it sir. We can create Threads by either implementing Runnable interface of by extending Thread Class.

            - Suresh Yadam

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              March 1, 2016

              I like your articles very much. I was going through Multithreading article and I think almost all things are covered except about ForkJoinPool class in java. It will be of very much help to me as well as others as all articles will get consolidated at one place only. It will be of much help if you can write about it. Thanks

              - Ankit Neema

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                August 29, 2016

                Hi i am writing about the Thread above Thread t = new Thread(() -> {System.out.println(“My Runnable”);}); t.run(); do you mean t.run(); or t.start(), ? thanks

                - Raed

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  April 20, 2017

                  Hi Pankaj, I have a doubt. How can we manage performance while 500 threads accessing a thread safe object? And each thread takes 1 min to complete its task.

                  - Aliva

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    April 25, 2017

                    how to print states of thread.

                    - shahebaz

                      Try DigitalOcean for free

                      Click below to sign up and get $200 of credit to try our products over 60 days!

                      Sign up

                      Join the Tech Talk
                      Success! Thank you! Please check your email for further details.

                      Please complete your information!

                      Become a contributor for community

                      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                      DigitalOcean Documentation

                      Full documentation for every DigitalOcean product.

                      Resources for startups and SMBs

                      The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                      Get our newsletter

                      Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                      New accounts only. By submitting your email you agree to our Privacy Policy

                      The developer cloud

                      Scale up as you grow — whether you're running one virtual machine or ten thousand.

                      Get started for free

                      Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                      *This promotional offer applies to new accounts only.