If you just invoke run() directly, it’s executed on the calling thread, just like any other method call.
Thread.start() will create a new thread so that the runnable’s run method is executed in parallel.
when program calls start() method a new Thread is created and code inside run() method is executed in new Thread while if you call run() method directly no new Thread is created and code inside run() will execute on currently running (existing) Thread.
Another difference between start() vs run() in Java thread is that you cannot call start() method more than one time on thread object. once started, second call of start() will throw IllegalStateException in Java while you can call run() method any number of times.