each target is running in its own thread now. Each agent has its own dedicated thread. Join is used to synchronize everything.