Reviewed by Aditya Kumar · Last reviewed 2026-03-24
**Default Thread.run():** Calls the Runnable's run() if constructed with Runnable. If you extend Thread and don't override run(), and pass no Runnable, run() does nothing—thread starts and exits immediately. **Why It Matters:** Silent no-op—hard to debug. Always override run()...
Default Thread.run(): Calls the Runnable's run() if constructed with Runnable. If you extend Thread and don't override run(), and pass no Runnable, run() does nothing—thread starts and exits immediately.
Why It Matters: Silent no-op—hard to debug. Always override run() when extending Thread, or pass Runnable to constructor (preferred—avoids inheritance).
Production: Prefer ExecutorService + Runnable over raw Thread. Never extend Thread without override—use composition.
class Bad extends Thread { / no run() / }
t.start(); // does nothing, returns immediately
Red Flag: Extending Thread for one-off task. Pro-Move: 'We use ExecutorService.submit(Runnable)—no Thread subclass, reusable pool.'
According to DataEngPrep.tech, this is one of the most frequently asked Python/Coding interview questions, reported at 1 company. DataEngPrep.tech maintains an editor-reviewed database of 1,863 data engineering interview questions across 7 categories.