From 3d155c481fa7981f84aa3655e8f22863be117e23 Mon Sep 17 00:00:00 2001 From: Kamil Rudny <134285490+krudny@users.noreply.github.com> Date: Wed, 13 Dec 2023 19:34:29 +0100 Subject: [PATCH] finished simulationengine with threadpool --- .../src/main/java/agh/ics/oop/Simulation.java | 5 +- oolab/src/main/java/agh/ics/oop/World.java | 32 ++++++++---- .../agh/ics/oop/model/AbstractWorldMap.java | 3 ++ .../agh/ics/oop/model/ConsoleMapDisplay.java | 10 ++-- .../java/agh/ics/oop/model/GrassField.java | 4 ++ .../agh/ics/oop/model/RectangularMap.java | 8 +++ .../agh/ics/oop/model/SimulationEngine.java | 51 +++++++++++++++++++ .../main/java/agh/ics/oop/model/WorldMap.java | 2 + 8 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java diff --git a/oolab/src/main/java/agh/ics/oop/Simulation.java b/oolab/src/main/java/agh/ics/oop/Simulation.java index 8c4ba9f..0794c18 100644 --- a/oolab/src/main/java/agh/ics/oop/Simulation.java +++ b/oolab/src/main/java/agh/ics/oop/Simulation.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -public class Simulation { +public class Simulation implements Runnable{ private final List Animals = new ArrayList<>(); private List Moves = new ArrayList<>(); private final WorldMap Map; @@ -26,10 +26,9 @@ public Simulation(List positions, List moves, WorldMap } - public void run() { + public synchronized void run() { int animal_count = Animals.size(); int cnt = 0; - for(MoveDirection currentMove : Moves) { Animal current_animal = Animals.get(0); Animals.remove(0); diff --git a/oolab/src/main/java/agh/ics/oop/World.java b/oolab/src/main/java/agh/ics/oop/World.java index 4f11d45..841f5a6 100644 --- a/oolab/src/main/java/agh/ics/oop/World.java +++ b/oolab/src/main/java/agh/ics/oop/World.java @@ -1,6 +1,7 @@ package agh.ics.oop; import agh.ics.oop.model.*; +import org.w3c.dom.css.Rect; import java.util.ArrayList; import java.util.List; @@ -27,22 +28,33 @@ public static void run(List directions) { } } } + public static void main(String[] args) { List directions = new ArrayList<>(); - String[] args1 = {"f", "f","f","f","f","f","f","f","f","f","f","f","f","f","f","f","f","f","f","f","f"}; + String[] args1 = {"f", "f","f","f","f","f","f","f","f"}; + try { - directions = OptionsParser.Parser(args1); - List positions = List.of(new Vector2d(2,2), new Vector2d(3,4), new Vector2d(0,0)); - GrassField map = new GrassField(10); - map.addListener(new ConsoleMapDisplay()); - Simulation sim = new Simulation(positions, directions, map); - sim.run(); - } catch (IllegalArgumentException e){ - e.printStackTrace(); - } + List listOfSimulations = new ArrayList<>(); + ConsoleMapDisplay listener = new ConsoleMapDisplay(); + for(int i = 0; i < 20; i++) { + directions = OptionsParser.Parser(args1); + List positions = List.of(new Vector2d(2,2), new Vector2d(3,4), new Vector2d(0,0)); + GrassField map = new GrassField(10); + map.addListener(listener); + listOfSimulations.add(new Simulation(positions, directions, map)); + } + SimulationEngine simulationEngine = new SimulationEngine(listOfSimulations); + simulationEngine.runAsyncInThreadPool(); + simulationEngine.awaitSimulationsEnds(); + + System.out.println("koniec programu"); + + } catch (IllegalArgumentException | InterruptedException e){ + e.printStackTrace(); + } } diff --git a/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java b/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java index de16d73..20490af 100644 --- a/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java @@ -8,6 +8,8 @@ public abstract class AbstractWorldMap implements WorldMap { protected Map animals = new HashMap<>(); + + public static int ID = 0; protected Map all_elements = new HashMap<>(); protected MapVisualizer mapVisualizer = new MapVisualizer(this); Vector2d MAP_LEFT_BOTTOM = new Vector2d(0,0); @@ -16,6 +18,7 @@ public abstract class AbstractWorldMap implements WorldMap { protected ArrayList listeners = new ArrayList<>(); public AbstractWorldMap() { + ID+=1; listeners = new ArrayList<>(); } diff --git a/oolab/src/main/java/agh/ics/oop/model/ConsoleMapDisplay.java b/oolab/src/main/java/agh/ics/oop/model/ConsoleMapDisplay.java index cb6f393..5768a52 100644 --- a/oolab/src/main/java/agh/ics/oop/model/ConsoleMapDisplay.java +++ b/oolab/src/main/java/agh/ics/oop/model/ConsoleMapDisplay.java @@ -1,14 +1,12 @@ package agh.ics.oop.model; public class ConsoleMapDisplay implements MapChangeListener{ - private int changescount; - - public ConsoleMapDisplay() { - this.changescount = 0; - } + private int changescount = 0; @Override - public void mapChanged(WorldMap worldMap, String message) { + public synchronized void mapChanged(WorldMap worldMap, String message) { changescount++; + + System.out.println(worldMap.getId()); System.out.println(message); System.out.println(worldMap.toString()); System.out.println("Number of changes: " + changescount + "\n\n\n"); diff --git a/oolab/src/main/java/agh/ics/oop/model/GrassField.java b/oolab/src/main/java/agh/ics/oop/model/GrassField.java index 1007451..7f770bd 100644 --- a/oolab/src/main/java/agh/ics/oop/model/GrassField.java +++ b/oolab/src/main/java/agh/ics/oop/model/GrassField.java @@ -63,4 +63,8 @@ public Map getElements(){ return all_elements; } + + public String getId(){ + return "GrassField Map nr " + ID; + } } \ No newline at end of file diff --git a/oolab/src/main/java/agh/ics/oop/model/RectangularMap.java b/oolab/src/main/java/agh/ics/oop/model/RectangularMap.java index cca8167..7d27ac1 100644 --- a/oolab/src/main/java/agh/ics/oop/model/RectangularMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/RectangularMap.java @@ -27,4 +27,12 @@ public Vector2d getMAP_RIGHT_TOP() { public Vector2d getMAP_LEFT_BOTTOM() { return MAP_LEFT_BOTTOM; } + @Override + public String toString() { + return mapVisualizer.draw(MAP_LEFT_BOTTOM, MAP_RIGHT_TOP); + } + + public String getId(){ + return "Rectangular MAP nr " + ID; + } } \ No newline at end of file diff --git a/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java b/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java new file mode 100644 index 0000000..8d35daf --- /dev/null +++ b/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java @@ -0,0 +1,51 @@ +package agh.ics.oop.model; + +import agh.ics.oop.Simulation; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +import static java.util.concurrent.Executors.newFixedThreadPool; + +public class SimulationEngine{ + + ExecutorService simulatorExecutor = null; + List simulationList = new ArrayList<>(); + List simulationThreads = new ArrayList<>(); + public SimulationEngine(List simulationList){ + this.simulationList = simulationList; + } + public void runSync(){ + for(Simulation simulation : simulationList){ + simulation.run(); + } + } + public void runAsync() { + for(Simulation simulation : simulationList) { + Thread thread = new Thread(simulation); + simulationThreads.add(thread); + thread.start(); + } + } + + public void awaitSimulationsEnds() throws InterruptedException + { + for(Thread thread : simulationThreads) { + thread.join(); + } + + if(simulatorExecutor != null) { + simulatorExecutor.shutdown(); + if (!simulatorExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + simulatorExecutor.shutdownNow(); + } + } + } + + public void runAsyncInThreadPool(){ + simulatorExecutor = newFixedThreadPool(4); + simulationList.forEach(simulatorExecutor :: submit); + } +} diff --git a/oolab/src/main/java/agh/ics/oop/model/WorldMap.java b/oolab/src/main/java/agh/ics/oop/model/WorldMap.java index bccdd79..5371a75 100644 --- a/oolab/src/main/java/agh/ics/oop/model/WorldMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/WorldMap.java @@ -42,4 +42,6 @@ public interface WorldMap extends MoveValidator { * @return animal or null if the position is not occupied. */ WorldElement objectAt(Vector2d position); + + String getId(); } \ No newline at end of file