Thread.start() is the "magic" method that actually creates a separate
thread of execution. You call start(), and start()'s implementation does the magic necessary to make run() execute asynchronously.
You
can call run() yourself, but it's absolutely pointless: run() is just a plain ordinary method, and if you call it, the caller will wait for it to return, just like any other method.