join() causes the currently executing thread to move into which state:
It causes the thread to move into a non-runnable state(Waiting for join completion State) which is represented by the constant Thread.WAITING(Enum in the Thread Class)
what does only join() on line#8 mean in the following example
You are right on this one, it waits for itself to finish and waits forever since the join method doesnt take an arguement.
Replacing the join with a one which takes an arguement makes the program deadlock-free.
The thread would now move into a Thread.TIMED_WAITING state for whatever duration it is waiting.
Hope that helped.