run() vs start() on a Thread Object
Fast recall
Quick revision
Core answer
run() directly executes it as an ordinary method on the current thread. Calling start() starts a new Java thread and that new thread invokes run(). A Thread object can be started only once; a second start() throws IllegalThreadStateException. Whether a Java thread maps one-to-one to an operating-system thread depends on whether it is a platform or virtual thread.Whether the candidate understands the critical difference between invoking a method and creating a new thread of execution.
Calling run() in test code and wondering why operations aren't happening concurrently or in parallel.
Explain that start() is a native method that asks the JVM to allocate OS resources for a new thread and schedule run() on it.
Interview-ready guide
Interview answer
If you call run instead of start on a Thread, no new thread is created at all.
The run method just executes as a normal method call in your current thread, completely synchronously. It's like calling any other method on an object. Only start creates an actual new thread of execution.
The start method is a native method that talks to the operating system to allocate a new OS thread with its own call stack and program counter. After you call start, the JVM schedules the run method to execute in that new thread, and both threads run in parallel. This matters a lot in production.
If you're building a REST service and you call run instead of start for background tasks, every request will block until the task finishes, killing your throughput.
A common mistake freshers make is writing new Thread task dot run, thinking they've made it concurrent, but it just blocks. In unit tests, though, calling run directly is actually useful because you can test the task logic synchronously without dealing with thread timing. So always use start in production code when you need real concurrency.
run() vs start() on a Thread Object
Direct Answer
Calling run() directly executes it as an ordinary method on the current thread. Calling start() starts a new Java thread and that new thread invokes run(). A Thread object can be started only once; a second start() throws IllegalThreadStateException. Whether a Java thread maps one-to-one to an operating-system thread depends on whether it is a platform or virtual thread.
Common Mistakes & Pitfalls
- Calling
run()in request handlers: Writingnew Thread(task).run()in a controller looks asynchronous but blocks the request thread completely. - Expecting ordered output: With
start(), output from different threads interleaves. That's correct behavior, not a bug. - Calling
start()twice: Reusing a finished thread by callingstart()again throwsIllegalThreadStateException. AThreadgoes from NEW to RUNNABLE only once.
Check your understanding
Answer these without looking back at the article.
- Can you call start() more than once on a Thread?
- What is IllegalThreadStateException?
- In what state does a thread enter when start() is called?
Looking for a structured roadmap?
Every module on this page is also part of the full Java backend interview track.