'Which method to use in which scenario?' what scenario?
In general, using neither would be a good start for efficient multithreaded design.
Join() seems to have been specifically designed to generate shutdown-deadlocks in GUI apps and the like.
isAlive() seems to have been specifically designed to encourage devs. to implement CPU-intensive and/or latency-ridden polling loops. I assume that it can generate false positives, ie. the thread is gone by the time it gets to return true.
I you need to 'start Thread-2 only after Thread-1 has completed', then either thread-2 is redundant, (in which case just call the function for 'thread-2' at the end of the function for thread-1), or you can simply start thread-2 at the end of the function for thread-1. No signaling/polling complication required at all.