import java.util.*; import java.util.concurrent.*; class AntFarm { private Environment env; private Point nest; private List ants; private ExecutorService executor; public AntFarm() { env = new Environment(15, 15); nest = new Point(10, 10); ants = Arrays.asList(new Ant(nest, nest, env), new Ant(nest, nest, env), new Ant(nest, nest, env) ); executor = Executors.newFixedThreadPool(2); } private void simulate() throws InterruptedException { CountDownLatch awaitAnts = new CountDownLatch(ants.size()); for (Ant ant : ants) executor.execute(() -> { ant.behave(); awaitAnts.countDown(); }); awaitAnts.await(); env.update(); // and anything you want.. } private void run() { try { for (int i = 0; i < 10; i++) { System.out.println("Simulation round #" + i); simulate(); } executor.shutdown(); System.out.println("Simulation is terminated"); } catch (InterruptedException e) { System.err.println("Interrupted :("); } } public static void main(String[] args) { new AntFarm().run(); } }