My understanding is that threads in theory are executed in parallel. JVM decides; when a resource is available which thread to pick from the waiting thread queue (based on some
Use an Executor:
executor.execute(runnable1); wait(); executor.execute(runnable2); wait(); executor.execute(runnable3); wait();
And of course, each Runnable has to end with a notify() statement.
notify()