A few weeks ago I came across an issue involving a Workflow Join Activity and some confusion around what it does and how it works. There is a little bit of documentation on the wiki but it still left some questions unanswered.
The purpose of the Join Activity is to combine two or more paths of execution after they have branched out. This serves the purpose of ensuring that subsequent activities will not get run multiple times with unexpected results.
A Join activity will always wait for all active paths of execution to reach it before proceeding.
The difference between the Complete and Incomplete outputs comes down to whether or not all possible paths of execution have completed. For example, if there is a split to have two simultaneous tasks on parallel paths then after both tasks have completed the Join will finish with Complete.
To contrast that, when there is an if statement, only one path will ever actually get executed so the Join will always exit as Incomplete.
Hopefully that clarifies things a bit for you; it certainly helped me to review how it worked.