From the code I understand that if we call t2.join(0) in thread t1, then, t1 will wait forever till t2 completes. t1 will start if thread t2 has finished.
am I right.
Almost right. Your first sentence is correct. t1 will wait, potentially forever, until t2 completes. Your second sentence is not quite right, but it's close. t1 won't necessarily start up again if t2 has finished, but t1 will become runnable when t2 finishes, so the thread scheduler can then resume the execution of t1 when the scheduler chooses to do so.