Java.Multithreading.What is the difference between start() and run() methods in Thread?

✅ The Thread class in Java just implements the Runnable interface. so…

🧵 The Core Difference

MethodWhat it Does
start()Starts a new thread of execution (calls run() on a new thread)
run()Just a normal method call, executes in the current thread

public class Main {

    static class MyThread extends Thread {
        private final String taskName;

        public MyThread(String taskName) {
            this.taskName = taskName;
        }

        @Override
        public void run() {
            System.out.println(taskName + " is running in thread: " + Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        System.out.println("Main starts in thread: " + Thread.currentThread().getName());

        MyThread thread1 = new MyThread("Task with start()");
        thread1.start(); // ✅ Runs on a new thread

        MyThread thread2 = new MyThread("Task with run()");
        thread2.run();   // ❌ Runs in the main thread like a normal method call

        System.out.println("Main ends in thread: " + Thread.currentThread().getName());
    }
}

🧾 Sample Output:

Main starts in thread: main
Task with start() is running in thread: Thread-0
Task with run() is running in thread: main
Main ends in thread: main

What This Shows:

ActionRuns on ThreadBehavior
start()Thread-0 (new thread)Runs concurrently with main
run()main threadRuns like a regular method call

🤯 Why Doesn’t run() Start a New Thread?

Because run() is just a method — it’s the task, not the thread itself.

The Thread class implements Runnable, and run() is just the code that the thread should execute — it does not contain any logic to start a new OS thread.

So the logic is separated into two parts:

PartWhat it does
run()Just a method — the code to run
start()Allocates a new thread from the OS, and then calls run() on that new thread

🧠 Why Java Was Designed This Way

1. Separation of Concerns

  • run() is the task (behavior)
  • start() is the mechanism (execution on a new thread)
  • This separation follows the single responsibility principle

2. Runnable is Reusable

  • You can pass the same Runnable object to multiple threads
  • Each thread controls when and how to execute the run() logic
Runnable task = () -> System.out.println("Running: " + Thread.currentThread().getName());

new Thread(task).start(); // runs on Thread-1
new Thread(task).start(); // runs on Thread-2

Imagine if run() automatically created a new thread — you’d lose control over how and where the code runs.


🛠 Why Not Make run() Start a Thread?

Because it breaks:

  • Composability: You might want to run run() directly in the same thread (like testing logic without creating a new thread)
  • Control: You’d have no way to run the logic synchronously if needed
  • Predictability: You’d have magic behavior inside what looks like a normal method

🔍 Analogy

Think of run() as the engine of a car.

  • start() turns on the engine in a new car (new thread)
  • Calling run() is like pulling the engine into your living room and turning it on — you’re running it, but not inside the vehicle it was meant for 🚗

💬 So Yes — It’s a Little Unintuitive

You’re right: many beginners expect run() to “do the thing” in a new thread.

But once you understand the design:

  • run() = “what to do”
  • start() = “start doing it on a new thread”

…it makes sense and gives you flexibility 💪

This entry was posted in Без рубрики. Bookmark the permalink.