Reg 1st question: How can this be when the join method has no parameter??
First of all:
t1 and t2 are created two different objects of R. So they wont block each other.
And there is a call t1.join() just after starting t1. That means main thread waits till the time t1 finishes its task. So run() method will be executed once and prints 123. After run() method is executed, main thread resumes and starts t2. As t2 is created with a different object of R, run() method will print 123. Hence the output is: 123123.
I am not sure why you are confused with join() with no parameters.
if you call join() with no parameters, the waiting thread will become runnable just after the other thread has finished.
if you specify the maximum time that a thread can wait for another thread to finish its task, the waiting thread will become runnable after the time has elapsed if the other thread has not finished before that.
Hope this is clear!