Have you checked out the Java Tutorial on Threads? It starts here.
Basically, you can think of the thread as a worker that will do a task for you. The run() method is a list of instructions that you give the worker (before they start doing it). The start() method is your command that says "now, start doing it!". When you create a thread, you call the start() command yourself, but you don't call the run() command. (You could, but it's pointless.) Instead, after you call start, the thread calls run() on its own.
start() does a lot of deep magic, setting up a new thread in the OS (in most modern JVMs), establishing a new stack, etc. One of the nice things about OO design is that Sun was able to completely change start() from using JVM managed threads to OS managed threads and we never had to even know about it.
As Jim said, start() eventually calls run() on the new thread. There's no magic in run(), unless it's you that puts it there.
A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi