// Tutorial //

Java Thread Join Example

Published on August 3, 2022
Default avatar
By Pankaj
Developer and author at DigitalOcean.
Java Thread Join Example

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.

Java Thread join method can be used to pause the current thread execution until unless the specified thread is dead. There are three overloaded join functions.

Java Thread join

java thread join, thread join example, java thread join example, thread join public final void join(): This java thread join method puts the current thread on wait until the thread on which it’s called is dead. If the thread is interrupted, it throws InterruptedException. public final synchronized void join(long millis): This java thread join method is used to wait for the thread on which it’s called to be dead or wait for specified milliseconds. Since thread execution depends on OS implementation, it doesn’t guarantee that the current thread will wait only for given time. public final synchronized void join(long millis, int nanos): This java thread join method is used to wait for thread to die for given milliseconds plus nanoseconds. Here is a simple example showing usage of Thread join methods. The goal of the program is to make sure main is the last thread to finish and third thread starts only when first one is dead.

package com.journaldev.threads;

public class ThreadJoinExample {

    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable(), "t1");
        Thread t2 = new Thread(new MyRunnable(), "t2");
        Thread t3 = new Thread(new MyRunnable(), "t3");
        //start second thread after waiting for 2 seconds or if it's dead
        try {
        } catch (InterruptedException e) {
        //start third thread only when first thread is dead
        try {
        } catch (InterruptedException e) {
        //let all threads finish execution before finishing main thread
        try {
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
        System.out.println("All threads are dead, exiting main thread");


class MyRunnable implements Runnable{

    public void run() {
        System.out.println("Thread started:::"+Thread.currentThread().getName());
        try {
        } catch (InterruptedException e) {
        System.out.println("Thread ended:::"+Thread.currentThread().getName());

Output of the above program is:

Thread started:::t1
Thread started:::t2
Thread ended:::t1
Thread started:::t3
Thread ended:::t2
Thread ended:::t3
All threads are dead, exiting main thread

That’s all for a quick roundup on java thread join example.

If you’ve enjoyed this tutorial and our broader community, consider checking out our DigitalOcean products which can also help you achieve your development goals.

Learn more here

About the authors
Default avatar


Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?

Why does t2 start before t1 ends? and t3 start before t2 ends?

- asdqqwe

    t2.start(); //start third thread only when first thread is dead try { t1.join(); It should be t2.join() instead of t1.join()

    - Anon

      Hi, What i need to use for Join thread in ExceutorService?

      - manish

        I have one doubt, as we can see in the implementation of the join() method , it waits until thread isAlive() method returen true. Now the question is when wait() is called on instance of the thread , it would be disabled for thread scheduling, So if i am calling join() on any thread instance , would it ever get chance to execute the code in run method as it is waiting in a loop over isAlive() method.

        - Siddharth

          Hi, I have one question in this, if t1 thread execution fails with NullPointer Exception , I need to stop the main thread or we have to capture wich thread is failed. Could you please explains this.

          - Eswar

            Best Example so Far. Thanks a lot to making join looks so easy.

            - Kamal Thakur

              Great explanations.This is wat needed…

              - pradpalnis

                U are fab pankaj.

                - kumkum

                  Simple but informative article:) Keep up the good work bro:) If possible pls add more articles to collection framework internals.

                  - Gopinath

                    I have doubt if we called join() without thread refference just like public void m1()throws Exception { join(); } what happened

                    - guru ghule