3 thread objects are created and initially their priorities are same. So, the first thread starts and enters into infinite while loop. This thread never blocks and hence runs for ever. However, this output needs not to be same for all the cases, since thread implementation is platform dependent. For instance, some operating systems use round robin scheduling, that time, will see all the threads are running in a periodic interval for a fixed time.
Thread can only be started by calling the start() method. In the above code , run() has be called on the instances of the thread. In this context run() method is executed like any other instance method. So, the above code does start any new thread.
But the anwser is 1 thread. As every time you run a program a new thread is created which invokes main() method.
If you watch closely, we instantiated only the runnable instances and then the called the run methods on these runnable objects.
This piece of code never passed a runnable object to a Thread constructor, to active a thread object.
The run, in this case, is treated as any normal method. (Note : even if the runnable object is passed to the thread constructor, the behavior would be, i.e.,invoking run method directly would still be treated as any normal method same as long as start method is not invoked). Hope this helps.