Its quite tricky to be honest, every time a monster needs to move something needs to fire a trigger or inform the monster, its unrealistic to give every monster cpu time, because most of them wont need it, so your wasting time on them, so its better to have it so that when players move around they trigger events which cause the monsters to move.
So depending on how many players you have in a map, and how many monsters you would probably want a thread per map with players on it minimum, with the ability to expand that if the map is very busy, then have the players trigger events for monsters on that thread and have that thread perform the necessary actions, or delegate to other threads.
It is definitely not a simple task, and there are of course many ways of doing this. Other options include giving CPU time to all monsters on all maps on one thread and performing actions depending on the circumstance of the individual monster. You could have a spawn object which detects when players move into the spawn and then have that delegate actions, however you would still need a way to give the relevant spawns CPU time.
Just a few thoughts for you. Im also about to start work on spawns myself in the open source project, so im sure i'll probably experiment with a few, most likely ill be trying my first suggestion to begin with (player triggered monsters).