- Edited
villagerAgentRandomisedPosition() doesn't merit to run in an own thread. You may want to actually profile this, but I'd say creating a thread is slower than just running that method.
Uniformly distributed random point in circle has a sqrt(), a sin() and a cos(), but since the radius seems to be fixed you can spare the sqrt() and calculate it just once. sin and cos are fast on current processors. Faster than opening a thread. Plus there's a better cache usage with small, concise code, that is the most important thing to observe when it comes to execution speed.
Also, try calling randomize() only once, at the beginning of the program. You gain nothing from calling it every frame, only less reproducibility in the sequence of random numbers.
I believe these two changes and letting go of threads (for the time being and for this purpose only!) already should be visible when profiling.
Otoh, premature optimization and the the root of all evil and all that :-)
I can say nothing about synchronization from these snippets alone.