Open In App

Java Thread.start() vs Thread.run() Method

Last Updated : 25 Oct, 2025
Comments
Improve
Suggest changes
42 Likes
Like
Report

In Java's multithreading concept, start() and run() are the two important methods of the Thread class. Although they might seem similar, they behave very differently. This article explains the differences and shows how to use them effectively.

Thread.start() Method

The start() method is used to begin a new thread of execution. It performs two main tasks:

  • Allocates resources for a new thread.
  • Calls the run() method internally in the new thread.
Java
class MyThread extends Thread {

    public void run(){

        System.out.println("Thread running using start()");
    }

    public static void main(String[] args)
    {
        MyThread t1 = new MyThread();
        
        // Starts a new thread
        t1.start(); 
    }
}

Output
Thread running using start()

Explanation: Calling start() creates a new thread. run() is executed in the context of that new thread.

Thread.run() Method

The run() method contains the code executed by the thread. However, calling run() directly does not create a new thread. Instead, it behaves like a normal method call executed in the current thread.

Java
class MyThread extends Thread{
    
    public void run(){
        
        System.out.println("Thread running using run()");
    }

    public static void main(String[] args){
        
        MyThread t1 = new MyThread();
        
        // Does NOT start a new thread
        t1.run(); 
    }
}

Output
Thread running using run()

Explanation: Here, run() is executed in the main thread, so no multithreading occurs.

Multiple Invocations

In Java's Multi-Threading Concept, another most important difference between start() and run() method is that we can't call the start() method twice otherwise it will throw an IllegalStateException whereas run() method can be called multiple times as it is just a normal method calling.

Example 1: Multiple invocation of start() method.

Java
class MyThread extends Thread {

    public void run(){

        System.out.println(
            "Current thread: "
            + Thread.currentThread().getName());
    }
}

public class Geeks{
    
    public static void main(String[] args){
        
        MyThread t = new MyThread();
        t.start();
        t.start(); // Throws exception
    }
}

Output:

Current thread: Thread-0
Exception in thread "main" java.lang.IllegalThreadStateException

Example 2: Multiple invocation of run() method 

Java
class MyThread extends Thread {

    public void run(){
        
        System.out.println(
            "Current thread: "
            + Thread.currentThread().getName());
    }
}

public class Geeks{
    
    public static void main(String[] args){
        
        MyThread t = new MyThread();
        t.run();
        t.run(); // Works fine
    }
}

Output
Current thread: main
Current thread: main

Explanation: As we can see in the above example, calling run() method twice doesn't raise any exception and it is executed twice as expected but on the main thread itself.

Thread.start() vs Thread.run() Method

Featurestart() Methodrun() Method
Thread CreationCreates a new thread.Does not create a new thread.
Execution ContextRuns run() in a separate thread.Runs run() in the current thread.
PurposeTo start concurrent execution.To define the code that a thread will execute.
BehaviorAllows true parallel execution.Acts like a normal method call.
Usage Examplet1.start();t1.run();



Explore