I agree join() is a common paradigm, yet it didn't fit what I wanted to accomplish.

finish() is responsible for sending a notify() which is what will trigger the SaveThread to end itself when all items have been processed.