From 3c40986cc48c529027c0fc509cf56abae8cb63f4 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Tue, 29 Nov 2022 18:45:31 +0300 Subject: [PATCH 01/15] Made Controller and some Main classes --- lab-02/.gitignore | 3 + .../docks_and_hobos/CargoDecoder.java | 18 ++++++ .../parfen01/docks_and_hobos/Controller.java | 63 +++++++++++++++++++ .../src/by/parfen01/docks_and_hobos/Dock.java | 29 +++++++++ .../by/parfen01/docks_and_hobos/Hobos.java | 4 ++ .../docks_and_hobos/HobosVillage.java | 4 ++ .../src/by/parfen01/docks_and_hobos/Main.java | 7 +++ .../src/by/parfen01/docks_and_hobos/Ship.java | 19 ++++++ .../docks_and_hobos/ShipGenerator.java | 49 +++++++++++++++ .../by/parfen01/docks_and_hobos/Tunnel.java | 30 +++++++++ 10 files changed, 226 insertions(+) create mode 100644 lab-02/.gitignore create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Controller.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Dock.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Hobos.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Main.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Ship.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java diff --git a/lab-02/.gitignore b/lab-02/.gitignore new file mode 100644 index 0000000..0b0c0f5 --- /dev/null +++ b/lab-02/.gitignore @@ -0,0 +1,3 @@ +/.idea/ +/lab-02.iml +/out/ diff --git a/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java b/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java new file mode 100644 index 0000000..d5e8e91 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java @@ -0,0 +1,18 @@ +package by.parfen01.docks_and_hobos; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.stream.IntStream; + +public class CargoDecoder { + private final HashMap cargoRepresent; + + public CargoDecoder(ArrayList cargo) { + cargoRepresent = new HashMap<>(); + IntStream.range(0, cargo.size()).forEach(i -> cargoRepresent.put(cargo.get(i), i)); + } + + public int cargoToProduct(String cargo) { + return cargoRepresent.get(cargo); + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java new file mode 100644 index 0000000..4112f61 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java @@ -0,0 +1,63 @@ +package by.parfen01.docks_and_hobos; + +import java.util.ArrayList; + +public class Controller { + private boolean isWorking; + private final ShipGenerator shipGenerator; + private final HobosVillage hobosVillage; + private final Tunnel tunnel; + private final CargoDecoder cargoDecoder; + + private final ArrayList docks; +// private final Logger logger; + private static Controller controller; + + public Controller(ShipGenerator shipGenerator, + HobosVillage hobosVillage, Tunnel tunnel, + CargoDecoder cargoDecoder, ArrayList docks) { + this.isWorking = false; + this.shipGenerator = shipGenerator; + this.hobosVillage = hobosVillage; + this.tunnel = tunnel; + this.cargoDecoder = cargoDecoder; + this.docks = docks; + controller = this; + } + + public static Controller getController() { + return controller; + } + + public ShipGenerator getShipGenerator() { + return shipGenerator; + } + + public HobosVillage getHobosVillage() { + return hobosVillage; + } + + public Tunnel getTunnel() { + return tunnel; + } + + public CargoDecoder getCargoDecoder() { + return cargoDecoder; + } + + public ArrayList getDocks() { + return docks; + } + + public boolean isWorking() { + return isWorking; + } + + public void start() { + isWorking = true; + } + + public void stop() { + isWorking = false; + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java new file mode 100644 index 0000000..529ed72 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -0,0 +1,29 @@ +package by.parfen01.docks_and_hobos; + +import static java.lang.Thread.sleep; + +public class Dock { + private final int unloadingSpeed; + private final int[] maxProductCapacity; + private final int[] productsCount; + + public Dock(int unloadingSpeed, int[] maxProductCapacity) { + this.unloadingSpeed = unloadingSpeed; + this.maxProductCapacity = maxProductCapacity; + productsCount = new int[maxProductCapacity.length]; + } + + public void UnloadShip(Ship ship) throws InterruptedException { + int product = Controller.getController().getCargoDecoder().cargoToProduct(ship.getCargoType()); + int pred = productsCount[product]; + productsCount[product] = Math.min(maxProductCapacity[product], + productsCount[product] + ship.getShipCapacity()); + sleep((productsCount[product] - pred) * 1000L / unloadingSpeed); + } + + public void start() throws InterruptedException { + while(Controller.getController().isWorking()) { + UnloadShip(Controller.getController().getTunnel().getShip()); + } + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java new file mode 100644 index 0000000..c3437eb --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java @@ -0,0 +1,4 @@ +package by.parfen01.docks_and_hobos; + +public class Hobos { +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java new file mode 100644 index 0000000..b75d628 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java @@ -0,0 +1,4 @@ +package by.parfen01.docks_and_hobos; + +public class HobosVillage { +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Main.java b/lab-02/src/by/parfen01/docks_and_hobos/Main.java new file mode 100644 index 0000000..de838a2 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Main.java @@ -0,0 +1,7 @@ +package by.parfen01.docks_and_hobos; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Ship.java b/lab-02/src/by/parfen01/docks_and_hobos/Ship.java new file mode 100644 index 0000000..7d32e29 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Ship.java @@ -0,0 +1,19 @@ +package by.parfen01.docks_and_hobos; + +public class Ship { + private final int shipCapacity; + private final String cargoType; + + public Ship(int shipCapacity, String cargoType) { + this.shipCapacity = shipCapacity; + this.cargoType = cargoType; + } + + public int getShipCapacity() { + return shipCapacity; + } + + public String getCargoType() { + return cargoType; + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java new file mode 100644 index 0000000..220e85b --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java @@ -0,0 +1,49 @@ +package by.parfen01.docks_and_hobos; + +import java.util.ArrayList; + +import static java.lang.Thread.sleep; + +public class ShipGenerator { + private final int shipCapacityMin; + private final int shipCapacityMax; + private final int generatingTime; + private final ArrayList cargoTypes; + + public ShipGenerator(int shipCapacityMin, int shipCapacityMax, + int generatingTime, ArrayList cargoTypes) { + this.shipCapacityMin = shipCapacityMin; + this.shipCapacityMax = shipCapacityMax; + this.generatingTime = generatingTime; + this.cargoTypes = cargoTypes; + } + + public void start() throws InterruptedException { + while(Controller.getController().isWorking()) { + Controller.getController().getTunnel().addShip(this.generate()); + sleep(generatingTime * 1000L); + } + } + + public Ship generate() { + int capacity = (int) (Math.random() * (shipCapacityMax - shipCapacityMin)) + shipCapacityMin; + String cargoType = cargoTypes.get((int) (Math.random() * cargoTypes.size())); + return new Ship(capacity, cargoType); + } + + public int getShipCapacityMin() { + return shipCapacityMin; + } + + public int getShipCapacityMax() { + return shipCapacityMax; + } + + public int getGeneratingTime() { + return generatingTime; + } + + public ArrayList getCargoTypes() { + return cargoTypes; + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java new file mode 100644 index 0000000..d6ba239 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -0,0 +1,30 @@ +package by.parfen01.docks_and_hobos; + +import java.util.PriorityQueue; + +public class Tunnel { + private final PriorityQueue shipQueue; + private final int maxShipCount; + + public Tunnel(int maxShipCount) { + this.maxShipCount = maxShipCount; + this.shipQueue = new PriorityQueue<>(); + } + + public void addShip(Ship ship) { + if (shipQueue.size() == maxShipCount) { + return; + } + shipQueue.add(ship); + if (shipQueue.size() == 1) { + notify(); + } + } + + public Ship getShip() throws InterruptedException { + if (shipQueue.isEmpty()) { + wait(); + } + return shipQueue.poll(); + } +} From 81f6b5e2907d5fb4823239ccdd3159d72abc61b8 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Tue, 29 Nov 2022 21:27:55 +0300 Subject: [PATCH 02/15] Made all entities without synchronization --- .../parfen01/docks_and_hobos/Controller.java | 40 +++++++++++- .../src/by/parfen01/docks_and_hobos/Dock.java | 8 +++ .../by/parfen01/docks_and_hobos/Hobos.java | 33 ++++++++++ .../docks_and_hobos/HobosVillage.java | 64 +++++++++++++++++++ .../docks_and_hobos/ShipGenerator.java | 2 +- 5 files changed, 145 insertions(+), 2 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java index 4112f61..85844af 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java @@ -10,6 +10,8 @@ public class Controller { private final CargoDecoder cargoDecoder; private final ArrayList docks; + + private ArrayList workingThreads; // private final Logger logger; private static Controller controller; @@ -55,9 +57,45 @@ public boolean isWorking() { public void start() { isWorking = true; + workingThreads = new ArrayList<>(); + Thread shipGeneratorThread = new Thread(() -> { + try { + shipGenerator.start(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + workingThreads.add(shipGeneratorThread); + Thread hobosVillageThread = new Thread(() -> { + try { + hobosVillage.start(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + workingThreads.add(hobosVillageThread); + for (Dock i : docks) { + Thread dockThread = new Thread(() -> { + try { + i.start(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + workingThreads.add(dockThread); + } + for (Thread i : workingThreads) { + i.start(); + } } - public void stop() { + public void stop() throws InterruptedException { + if (workingThreads == null) { + return; + } isWorking = false; + for (Thread i : workingThreads) { + i.join(); + } } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java index 529ed72..8d8c214 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -26,4 +26,12 @@ public void start() throws InterruptedException { UnloadShip(Controller.getController().getTunnel().getShip()); } } + + boolean stealProduct(int product) { + if (productsCount[product] == 0) { + return false; + } + --productsCount[product]; + return true; + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java index c3437eb..bfd8b6e 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java @@ -1,4 +1,37 @@ package by.parfen01.docks_and_hobos; +import java.util.ArrayList; + +import static java.lang.Thread.sleep; + public class Hobos { + private final int stealingTime; + + public Hobos(int stealingTime) { + this.stealingTime = stealingTime; + } + + public void start() throws InterruptedException { + while (Controller.getController().isWorking()) { + int product = Controller.getController().getHobosVillage().getAbsentProduct(); + if (product == -1) { + break; + } + steal(product); + } + } + + public void steal(int product) throws InterruptedException { + while (Controller.getController().isWorking()) { + ArrayList docks = Controller.getController().getDocks(); + for (Dock dock : docks) { + if (dock.stealProduct(product)) { + break; + } + } + } + sleep(stealingTime * 1000L); + ++Controller.getController().getHobosVillage() + .getCurrentIngredientsCount()[product]; + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java index b75d628..000a1f1 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java @@ -1,4 +1,68 @@ package by.parfen01.docks_and_hobos; +import java.util.ArrayList; + +import static java.lang.Thread.sleep; + public class HobosVillage { + private final int[] requiredIngredientsCount; + private final int[] currentIngredientsCount; + private final int eatingTime; + private final ArrayList hobos; + + public HobosVillage(int[] requiredIngredientsCount, int eatingTime, ArrayList hobos) { + this.requiredIngredientsCount = requiredIngredientsCount; + this.eatingTime = eatingTime; + this.hobos = hobos; + currentIngredientsCount = new int[this.requiredIngredientsCount.length]; + } + + public int[] getCurrentIngredientsCount() { + return currentIngredientsCount; + } + + public int getAbsentProduct() { + for (int i = 0; i < currentIngredientsCount.length; ++i) { + if (requiredIngredientsCount[i] > currentIngredientsCount[i]) { + return i; + } + } + return -1; + } + + public void cookAndEat() throws InterruptedException { + for (int i = 0; i < currentIngredientsCount.length; ++i) { + currentIngredientsCount[i] -= requiredIngredientsCount[i]; + } + sleep(eatingTime * 1000L); + } + + public void start() throws InterruptedException { + while (Controller.getController().isWorking()) { + int firstCook = (int) (Math.random() * hobos.size()); + int secondCook = (int) (Math.random() * hobos.size()); + if (secondCook == firstCook) { + secondCook = (secondCook + 1) % hobos.size(); + } + ArrayList threads = new ArrayList<>(); + for (int i = 0; i < hobos.size(); ++i) { + if (i != firstCook && i != secondCook) { + int finalI = i; + Thread thread = new Thread(() -> { + try { + hobos.get(finalI).start(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + thread.start(); + threads.add(thread); + } + } + for (Thread i : threads) { + i.join(); + } + cookAndEat(); + } + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java index 220e85b..6d75670 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java @@ -19,7 +19,7 @@ public ShipGenerator(int shipCapacityMin, int shipCapacityMax, } public void start() throws InterruptedException { - while(Controller.getController().isWorking()) { + while (Controller.getController().isWorking()) { Controller.getController().getTunnel().addShip(this.generate()); sleep(generatingTime * 1000L); } From 656ef10cfbbf53302a2468a4e68f56f1a2d1200d Mon Sep 17 00:00:00 2001 From: parfen01 Date: Tue, 29 Nov 2022 21:52:46 +0300 Subject: [PATCH 03/15] Add synchronization --- .../src/by/parfen01/docks_and_hobos/Dock.java | 20 ++++++++++--------- .../by/parfen01/docks_and_hobos/Hobos.java | 7 ++++--- .../docks_and_hobos/HobosVillage.java | 15 +++++++------- .../by/parfen01/docks_and_hobos/Tunnel.java | 6 ++---- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java index 8d8c214..8929243 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -1,24 +1,26 @@ package by.parfen01.docks_and_hobos; +import java.util.concurrent.atomic.AtomicIntegerArray; + import static java.lang.Thread.sleep; public class Dock { private final int unloadingSpeed; - private final int[] maxProductCapacity; - private final int[] productsCount; + private final int[] maxProductCapacity; + private final AtomicIntegerArray productsCount; public Dock(int unloadingSpeed, int[] maxProductCapacity) { this.unloadingSpeed = unloadingSpeed; this.maxProductCapacity = maxProductCapacity; - productsCount = new int[maxProductCapacity.length]; + productsCount = new AtomicIntegerArray(maxProductCapacity.length); } public void UnloadShip(Ship ship) throws InterruptedException { int product = Controller.getController().getCargoDecoder().cargoToProduct(ship.getCargoType()); - int pred = productsCount[product]; - productsCount[product] = Math.min(maxProductCapacity[product], - productsCount[product] + ship.getShipCapacity()); - sleep((productsCount[product] - pred) * 1000L / unloadingSpeed); + int pred = productsCount.get(product); + productsCount.set(product, Math.min(maxProductCapacity[product], + productsCount.get(product) + ship.getShipCapacity())); + sleep((productsCount.get(product) - pred) * 1000L / unloadingSpeed); } public void start() throws InterruptedException { @@ -28,10 +30,10 @@ public void start() throws InterruptedException { } boolean stealProduct(int product) { - if (productsCount[product] == 0) { + if (productsCount.get(product) == 0) { return false; } - --productsCount[product]; + productsCount.decrementAndGet(product); return true; } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java index bfd8b6e..20402c5 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java @@ -22,16 +22,17 @@ public void start() throws InterruptedException { } public void steal(int product) throws InterruptedException { + label: while (Controller.getController().isWorking()) { ArrayList docks = Controller.getController().getDocks(); for (Dock dock : docks) { if (dock.stealProduct(product)) { - break; + break label; } } } sleep(stealingTime * 1000L); - ++Controller.getController().getHobosVillage() - .getCurrentIngredientsCount()[product]; + Controller.getController().getHobosVillage() + .getCurrentIngredientsCount().incrementAndGet(product); } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java index 000a1f1..5210985 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java @@ -1,12 +1,13 @@ package by.parfen01.docks_and_hobos; import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicIntegerArray; import static java.lang.Thread.sleep; public class HobosVillage { private final int[] requiredIngredientsCount; - private final int[] currentIngredientsCount; + private final AtomicIntegerArray currentIngredientsCount; private final int eatingTime; private final ArrayList hobos; @@ -14,16 +15,16 @@ public HobosVillage(int[] requiredIngredientsCount, int eatingTime, ArrayList currentIngredientsCount[i]) { + for (int i = 0; i < requiredIngredientsCount.length; ++i) { + if (requiredIngredientsCount[i] > currentIngredientsCount.get(i)) { return i; } } @@ -31,8 +32,8 @@ public int getAbsentProduct() { } public void cookAndEat() throws InterruptedException { - for (int i = 0; i < currentIngredientsCount.length; ++i) { - currentIngredientsCount[i] -= requiredIngredientsCount[i]; + for (int i = 0; i < requiredIngredientsCount.length; ++i) { + currentIngredientsCount.set(i, currentIngredientsCount.get(i) - requiredIngredientsCount[i]); } sleep(eatingTime * 1000L); } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java index d6ba239..54cf24f 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -16,13 +16,11 @@ public void addShip(Ship ship) { return; } shipQueue.add(ship); - if (shipQueue.size() == 1) { - notify(); - } + notify(); } public Ship getShip() throws InterruptedException { - if (shipQueue.isEmpty()) { + while (shipQueue.isEmpty()) { wait(); } return shipQueue.poll(); From 5832092f54ea9d6213e9296a6b1516daeec77e67 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Wed, 30 Nov 2022 10:05:49 +0300 Subject: [PATCH 04/15] Add more synchronization + made demo console logging --- .../docks_and_hobos/CargoDecoder.java | 8 +++++- .../parfen01/docks_and_hobos/Controller.java | 16 ++++++----- .../src/by/parfen01/docks_and_hobos/Dock.java | 15 ++++++++++- .../by/parfen01/docks_and_hobos/Hobos.java | 7 +++++ .../docks_and_hobos/HobosVillage.java | 11 ++++++++ .../src/by/parfen01/docks_and_hobos/Main.java | 24 +++++++++++++++-- .../src/by/parfen01/docks_and_hobos/Ship.java | 11 ++++++++ .../docks_and_hobos/ShipGenerator.java | 19 +++---------- .../by/parfen01/docks_and_hobos/Tunnel.java | 27 +++++++++++++------ 9 files changed, 103 insertions(+), 35 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java b/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java index d5e8e91..d2fdb38 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/CargoDecoder.java @@ -6,13 +6,19 @@ public class CargoDecoder { private final HashMap cargoRepresent; + private final ArrayList productNames; public CargoDecoder(ArrayList cargo) { - cargoRepresent = new HashMap<>(); + this.productNames = cargo; + this.cargoRepresent = new HashMap<>(); IntStream.range(0, cargo.size()).forEach(i -> cargoRepresent.put(cargo.get(i), i)); } public int cargoToProduct(String cargo) { return cargoRepresent.get(cargo); } + + public String getProductName(int product) { + return productNames.get(product); + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java index 85844af..24562bf 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Controller.java @@ -1,6 +1,8 @@ package by.parfen01.docks_and_hobos; import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; public class Controller { private boolean isWorking; @@ -8,11 +10,9 @@ public class Controller { private final HobosVillage hobosVillage; private final Tunnel tunnel; private final CargoDecoder cargoDecoder; - private final ArrayList docks; - private ArrayList workingThreads; -// private final Logger logger; + private final Logger consoleLogger; private static Controller controller; public Controller(ShipGenerator shipGenerator, @@ -24,6 +24,7 @@ public Controller(ShipGenerator shipGenerator, this.tunnel = tunnel; this.cargoDecoder = cargoDecoder; this.docks = docks; + this.consoleLogger = Logger.getLogger(Controller.class.getName()); controller = this; } @@ -31,10 +32,6 @@ public static Controller getController() { return controller; } - public ShipGenerator getShipGenerator() { - return shipGenerator; - } - public HobosVillage getHobosVillage() { return hobosVillage; } @@ -50,6 +47,9 @@ public CargoDecoder getCargoDecoder() { public ArrayList getDocks() { return docks; } + public Logger getConsoleLogger() { + return consoleLogger; + } public boolean isWorking() { return isWorking; @@ -97,5 +97,7 @@ public void stop() throws InterruptedException { for (Thread i : workingThreads) { i.join(); } + consoleLogger.log( + Level.INFO, "Stop"); } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java index 8929243..2807b7d 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -1,29 +1,38 @@ package by.parfen01.docks_and_hobos; import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.logging.Level; import static java.lang.Thread.sleep; public class Dock { + private final int id; private final int unloadingSpeed; private final int[] maxProductCapacity; private final AtomicIntegerArray productsCount; - public Dock(int unloadingSpeed, int[] maxProductCapacity) { + public Dock(int id, int unloadingSpeed, int[] maxProductCapacity) { + this.id = id; this.unloadingSpeed = unloadingSpeed; this.maxProductCapacity = maxProductCapacity; productsCount = new AtomicIntegerArray(maxProductCapacity.length); } public void UnloadShip(Ship ship) throws InterruptedException { + Controller.getController().getConsoleLogger().log( + Level.INFO, "Ship number " + ship.getId() + " started unload in dock number " + id); int product = Controller.getController().getCargoDecoder().cargoToProduct(ship.getCargoType()); int pred = productsCount.get(product); productsCount.set(product, Math.min(maxProductCapacity[product], productsCount.get(product) + ship.getShipCapacity())); sleep((productsCount.get(product) - pred) * 1000L / unloadingSpeed); + Controller.getController().getConsoleLogger().log( + Level.INFO, "Ship number " + ship.getId() + " unloaded in dock number " + id); } public void start() throws InterruptedException { + Controller.getController().getConsoleLogger().log( + Level.INFO, "Dock number " + id + " started to work"); while(Controller.getController().isWorking()) { UnloadShip(Controller.getController().getTunnel().getShip()); } @@ -36,4 +45,8 @@ boolean stealProduct(int product) { productsCount.decrementAndGet(product); return true; } + + public int getId() { + return id; + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java index 20402c5..08647e6 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java @@ -1,6 +1,7 @@ package by.parfen01.docks_and_hobos; import java.util.ArrayList; +import java.util.logging.Level; import static java.lang.Thread.sleep; @@ -22,16 +23,22 @@ public void start() throws InterruptedException { } public void steal(int product) throws InterruptedException { + int dockId = -1; label: while (Controller.getController().isWorking()) { ArrayList docks = Controller.getController().getDocks(); for (Dock dock : docks) { if (dock.stealProduct(product)) { + dockId = dock.getId(); break label; } } } sleep(stealingTime * 1000L); + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos stole " + + Controller.getController().getCargoDecoder().getProductName(product) + + " from dock number " + dockId); Controller.getController().getHobosVillage() .getCurrentIngredientsCount().incrementAndGet(product); } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java index 5210985..bf1680f 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.logging.Level; import static java.lang.Thread.sleep; @@ -32,13 +33,19 @@ public int getAbsentProduct() { } public void cookAndEat() throws InterruptedException { + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos started to eat"); for (int i = 0; i < requiredIngredientsCount.length; ++i) { currentIngredientsCount.set(i, currentIngredientsCount.get(i) - requiredIngredientsCount[i]); } sleep(eatingTime * 1000L); + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos ended to eat"); } public void start() throws InterruptedException { + Controller.getController().getConsoleLogger().log( + Level.INFO, "HobosVillage started to work"); while (Controller.getController().isWorking()) { int firstCook = (int) (Math.random() * hobos.size()); int secondCook = (int) (Math.random() * hobos.size()); @@ -46,6 +53,8 @@ public void start() throws InterruptedException { secondCook = (secondCook + 1) % hobos.size(); } ArrayList threads = new ArrayList<>(); + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos started to steal"); for (int i = 0; i < hobos.size(); ++i) { if (i != firstCook && i != secondCook) { int finalI = i; @@ -63,6 +72,8 @@ public void start() throws InterruptedException { for (Thread i : threads) { i.join(); } + Controller.getController().getConsoleLogger().log( + Level.INFO, "All hobos returned home"); cookAndEat(); } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Main.java b/lab-02/src/by/parfen01/docks_and_hobos/Main.java index de838a2..0c4e79f 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Main.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Main.java @@ -1,7 +1,27 @@ package by.parfen01.docks_and_hobos; +import java.util.ArrayList; +import java.util.List; + +import static java.lang.Thread.sleep; + public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); + public static void main(String[] args) throws InterruptedException { + ArrayList cargoTypes = new ArrayList<>(List.of("bread", "meat", "milk", "cucumber")); + ShipGenerator shipGenerator = new ShipGenerator(1, 100, 10, cargoTypes); + Hobos firstHobos = new Hobos(9); + Hobos secondHobos = new Hobos(7); + Hobos thirdHobos = new Hobos(14); + Hobos fourthHobos = new Hobos(3); + Hobos fifthHobos = new Hobos(1); + HobosVillage village = new HobosVillage(new int[]{2, 3, 1, 4}, 30, + new ArrayList<>(List.of(firstHobos, secondHobos, thirdHobos, fourthHobos, fifthHobos))); + Dock firstDock = new Dock(1, 2, new int[]{100, 50, 30, 30}); + Dock secondDock = new Dock(2,4, new int[]{5, 20, 120, 20}); + Controller controller = new Controller(shipGenerator, village, + new Tunnel(5), new CargoDecoder(cargoTypes), new ArrayList<>(List.of(firstDock, secondDock))); + controller.start(); + sleep(500 * 1000L); + controller.stop(); } } \ No newline at end of file diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Ship.java b/lab-02/src/by/parfen01/docks_and_hobos/Ship.java index 7d32e29..4087650 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Ship.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Ship.java @@ -1,12 +1,19 @@ package by.parfen01.docks_and_hobos; +import java.util.logging.Level; + public class Ship { + private final int id; private final int shipCapacity; private final String cargoType; + static private int lastId = 0; public Ship(int shipCapacity, String cargoType) { + this.id = ++lastId; this.shipCapacity = shipCapacity; this.cargoType = cargoType; + Controller.getController().getConsoleLogger().log( + Level.INFO, "Created new ship"); } public int getShipCapacity() { @@ -16,4 +23,8 @@ public int getShipCapacity() { public String getCargoType() { return cargoType; } + + public int getId() { + return id; + } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java index 6d75670..3291f50 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java @@ -1,6 +1,7 @@ package by.parfen01.docks_and_hobos; import java.util.ArrayList; +import java.util.logging.Level; import static java.lang.Thread.sleep; @@ -19,6 +20,8 @@ public ShipGenerator(int shipCapacityMin, int shipCapacityMax, } public void start() throws InterruptedException { + Controller.getController().getConsoleLogger().log( + Level.INFO, "ShipGenerator started to work"); while (Controller.getController().isWorking()) { Controller.getController().getTunnel().addShip(this.generate()); sleep(generatingTime * 1000L); @@ -30,20 +33,4 @@ public Ship generate() { String cargoType = cargoTypes.get((int) (Math.random() * cargoTypes.size())); return new Ship(capacity, cargoType); } - - public int getShipCapacityMin() { - return shipCapacityMin; - } - - public int getShipCapacityMax() { - return shipCapacityMax; - } - - public int getGeneratingTime() { - return generatingTime; - } - - public ArrayList getCargoTypes() { - return cargoTypes; - } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java index 54cf24f..94b2257 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -1,28 +1,39 @@ package by.parfen01.docks_and_hobos; -import java.util.PriorityQueue; +import java.util.ArrayDeque; +import java.util.logging.Level; public class Tunnel { - private final PriorityQueue shipQueue; + private final ArrayDeque shipQueue; private final int maxShipCount; public Tunnel(int maxShipCount) { this.maxShipCount = maxShipCount; - this.shipQueue = new PriorityQueue<>(); + this.shipQueue = new ArrayDeque<>(); } - public void addShip(Ship ship) { + public synchronized void addShip(Ship ship) { if (shipQueue.size() == maxShipCount) { + Controller.getController().getConsoleLogger().log( + Level.INFO, "The ship number " + ship.getId() + " sank"); return; } shipQueue.add(ship); - notify(); + if (shipQueue.size() == 1) { + notify(); + } + Controller.getController().getConsoleLogger().log( + Level.INFO, "The ship number " + ship.getId() + " entered tunnel"); } - public Ship getShip() throws InterruptedException { - while (shipQueue.isEmpty()) { + public synchronized Ship getShip() throws InterruptedException { + if (shipQueue.isEmpty()) { wait(); } - return shipQueue.poll(); + Ship result = shipQueue.poll(); + assert(result != null); + Controller.getController().getConsoleLogger().log( + Level.INFO, "The ship number " + result.getId() + " leaved tunnel"); + return result; } } From e689b50b9456bfb4c95b7c6b59ef1f8afbf491da Mon Sep 17 00:00:00 2001 From: parfen01 Date: Wed, 30 Nov 2022 10:20:30 +0300 Subject: [PATCH 05/15] Add json library --- lab-02/lib/json-simple-1.1.jar | Bin 0 -> 16046 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lab-02/lib/json-simple-1.1.jar diff --git a/lab-02/lib/json-simple-1.1.jar b/lab-02/lib/json-simple-1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..f395f41471a796876278a6c5667ded4632546893 GIT binary patch literal 16046 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 Date: Wed, 30 Nov 2022 10:45:28 +0300 Subject: [PATCH 06/15] Add json file --- .../by/parfen01/docks_and_hobos/config.json | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/config.json diff --git a/lab-02/src/by/parfen01/docks_and_hobos/config.json b/lab-02/src/by/parfen01/docks_and_hobos/config.json new file mode 100644 index 0000000..4ee382b --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/config.json @@ -0,0 +1,66 @@ +{ + "ShipGenerator" : { + "shipCapacityMin" : 1, + "shipCapacityMax" : 100, + "generatingTime" : 7, + "cargoTypes" : [ + "milk", + "meat", + "bread", + "carrot", + "cucumber" + ] + }, + "Tunnel" : 7, + "Docks" : [ + { + "id" : 1, + "unloading speed" : 4, + "maxProductCapacity" : [ + 50, + 50, + 20, + 25, + 100 + ] + }, + { + "id" : 2, + "unloading speed" : 7, + "maxProductCapacity" : [ + 80, + 100, + 35, + 40, + 55 + ] + } + ], + "Hobos" : [ + { + "stealingTime" : 7 + }, + { + "stealingTime" : 2 + }, + { + "stealingTime" : 1 + }, + { + "stealingTime" : 5 + }, + { + "stealingTime" : 3 + } + ], + "hobosVillage" : { + "eatingTime" : 10, + "IngredientsCount" : [ + 11, + 4, + 8, + 9, + 2 + ] + } +} \ No newline at end of file From 030059cfa102b9afff2020c9566a1cd5dcd0a294 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Wed, 30 Nov 2022 16:45:41 +0300 Subject: [PATCH 07/15] Parsed json, stop() works more properly. --- .../src/by/parfen01/docks_and_hobos/Dock.java | 7 +- .../src/by/parfen01/docks_and_hobos/Main.java | 30 ++++---- .../by/parfen01/docks_and_hobos/Tunnel.java | 3 + .../by/parfen01/docks_and_hobos/config.json | 6 +- .../{ => control}/Controller.java | 14 +++- .../control/ProjectInitializer.java | 68 +++++++++++++++++++ .../docks_and_hobos/{ => hobos}/Hobos.java | 11 ++- .../{ => hobos}/HobosVillage.java | 9 ++- .../docks_and_hobos/{ => ships}/Ship.java | 4 +- .../{ => ships}/ShipGenerator.java | 4 +- 10 files changed, 127 insertions(+), 29 deletions(-) rename lab-02/src/by/parfen01/docks_and_hobos/{ => control}/Controller.java (86%) create mode 100644 lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java rename lab-02/src/by/parfen01/docks_and_hobos/{ => hobos}/Hobos.java (72%) rename lab-02/src/by/parfen01/docks_and_hobos/{ => hobos}/HobosVillage.java (87%) rename lab-02/src/by/parfen01/docks_and_hobos/{ => ships}/Ship.java (86%) rename lab-02/src/by/parfen01/docks_and_hobos/{ => ships}/ShipGenerator.java (92%) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java index 2807b7d..4292dbe 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -1,5 +1,8 @@ package by.parfen01.docks_and_hobos; +import by.parfen01.docks_and_hobos.control.Controller; +import by.parfen01.docks_and_hobos.ships.Ship; + import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.logging.Level; @@ -20,7 +23,7 @@ public Dock(int id, int unloadingSpeed, int[] maxProductCapacity) { public void UnloadShip(Ship ship) throws InterruptedException { Controller.getController().getConsoleLogger().log( - Level.INFO, "Ship number " + ship.getId() + " started unload in dock number " + id); + Level.INFO, "Ship number " + ship.getId() + " started to unload in dock number " + id); int product = Controller.getController().getCargoDecoder().cargoToProduct(ship.getCargoType()); int pred = productsCount.get(product); productsCount.set(product, Math.min(maxProductCapacity[product], @@ -38,7 +41,7 @@ public void start() throws InterruptedException { } } - boolean stealProduct(int product) { + public boolean stealProduct(int product) { if (productsCount.get(product) == 0) { return false; } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Main.java b/lab-02/src/by/parfen01/docks_and_hobos/Main.java index 0c4e79f..2533da3 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Main.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Main.java @@ -1,27 +1,23 @@ package by.parfen01.docks_and_hobos; -import java.util.ArrayList; -import java.util.List; +import by.parfen01.docks_and_hobos.control.Controller; +import by.parfen01.docks_and_hobos.control.ProjectInitializer; +import org.json.simple.parser.ParseException; + +import java.io.IOException; import static java.lang.Thread.sleep; public class Main { - public static void main(String[] args) throws InterruptedException { - ArrayList cargoTypes = new ArrayList<>(List.of("bread", "meat", "milk", "cucumber")); - ShipGenerator shipGenerator = new ShipGenerator(1, 100, 10, cargoTypes); - Hobos firstHobos = new Hobos(9); - Hobos secondHobos = new Hobos(7); - Hobos thirdHobos = new Hobos(14); - Hobos fourthHobos = new Hobos(3); - Hobos fifthHobos = new Hobos(1); - HobosVillage village = new HobosVillage(new int[]{2, 3, 1, 4}, 30, - new ArrayList<>(List.of(firstHobos, secondHobos, thirdHobos, fourthHobos, fifthHobos))); - Dock firstDock = new Dock(1, 2, new int[]{100, 50, 30, 30}); - Dock secondDock = new Dock(2,4, new int[]{5, 20, 120, 20}); - Controller controller = new Controller(shipGenerator, village, - new Tunnel(5), new CargoDecoder(cargoTypes), new ArrayList<>(List.of(firstDock, secondDock))); + public static void main(String[] args) throws InterruptedException, IOException, ParseException { + String path = args[0]; + Controller controller = ProjectInitializer.initController(path); + controller.start(); + sleep(10 * 1000L); + controller.stop(); + sleep(10 * 1000L); controller.start(); - sleep(500 * 1000L); + sleep((500 * 1000L)); controller.stop(); } } \ No newline at end of file diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java index 94b2257..cab5320 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -1,5 +1,8 @@ package by.parfen01.docks_and_hobos; +import by.parfen01.docks_and_hobos.control.Controller; +import by.parfen01.docks_and_hobos.ships.Ship; + import java.util.ArrayDeque; import java.util.logging.Level; diff --git a/lab-02/src/by/parfen01/docks_and_hobos/config.json b/lab-02/src/by/parfen01/docks_and_hobos/config.json index 4ee382b..481fab8 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/config.json +++ b/lab-02/src/by/parfen01/docks_and_hobos/config.json @@ -15,7 +15,7 @@ "Docks" : [ { "id" : 1, - "unloading speed" : 4, + "unloadingSpeed" : 4, "maxProductCapacity" : [ 50, 50, @@ -26,7 +26,7 @@ }, { "id" : 2, - "unloading speed" : 7, + "unloadingSpeed" : 7, "maxProductCapacity" : [ 80, 100, @@ -55,7 +55,7 @@ ], "hobosVillage" : { "eatingTime" : 10, - "IngredientsCount" : [ + "ingredientsCount" : [ 11, 4, 8, diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java similarity index 86% rename from lab-02/src/by/parfen01/docks_and_hobos/Controller.java rename to lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java index 24562bf..b103a5f 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Controller.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java @@ -1,4 +1,10 @@ -package by.parfen01.docks_and_hobos; +package by.parfen01.docks_and_hobos.control; + +import by.parfen01.docks_and_hobos.CargoDecoder; +import by.parfen01.docks_and_hobos.Dock; +import by.parfen01.docks_and_hobos.Tunnel; +import by.parfen01.docks_and_hobos.hobos.HobosVillage; +import by.parfen01.docks_and_hobos.ships.ShipGenerator; import java.util.ArrayList; import java.util.logging.Level; @@ -57,6 +63,8 @@ public boolean isWorking() { public void start() { isWorking = true; + consoleLogger.log( + Level.INFO, "Start"); workingThreads = new ArrayList<>(); Thread shipGeneratorThread = new Thread(() -> { try { @@ -95,7 +103,9 @@ public void stop() throws InterruptedException { } isWorking = false; for (Thread i : workingThreads) { - i.join(); + if (i.getState() != Thread.State.WAITING) { + i.join(); + } } consoleLogger.log( Level.INFO, "Stop"); diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java new file mode 100644 index 0000000..4982409 --- /dev/null +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java @@ -0,0 +1,68 @@ +package by.parfen01.docks_and_hobos.control; + +import by.parfen01.docks_and_hobos.CargoDecoder; +import by.parfen01.docks_and_hobos.Dock; +import by.parfen01.docks_and_hobos.Tunnel; +import by.parfen01.docks_and_hobos.hobos.Hobos; +import by.parfen01.docks_and_hobos.hobos.HobosVillage; +import by.parfen01.docks_and_hobos.ships.ShipGenerator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +public class ProjectInitializer { + public static Controller initController(String path) throws IOException, ParseException { + ArrayList hobos = new ArrayList<>(); + ArrayList cargo = new ArrayList<>(); + ArrayList docks = new ArrayList<>(); + ShipGenerator shipGenerator; + HobosVillage hobosVillage; + CargoDecoder cargoDecoder; + Tunnel tunnel; + Object obj = new JSONParser().parse(new FileReader(path)); + JSONObject jsonObject = (JSONObject) obj; + tunnel = new Tunnel((int) (long) jsonObject.get("Tunnel")); + JSONObject jsonShip = (JSONObject) jsonObject.get("ShipGenerator"); + int shipCapacityMin = (int) (long) jsonShip.get("shipCapacityMin"); + int shipCapacityMax = (int) (long) jsonShip.get("shipCapacityMax"); + int generatingTime = (int) (long) jsonShip.get("generatingTime"); + JSONArray jsonCargo = (JSONArray) jsonShip.get("cargoTypes"); + for (Object i : jsonCargo) { + cargo.add((String) i); + } + shipGenerator = new ShipGenerator(shipCapacityMin, shipCapacityMax, generatingTime, cargo); + cargoDecoder = new CargoDecoder(cargo); + JSONArray jsonDocks = (JSONArray) jsonObject.get("Docks"); + for (Object i : jsonDocks) { + JSONObject jsonDock = (JSONObject) i; + int id = (int) (long) jsonDock.get("id"); + int unloadingSpeed = (int) (long) jsonDock.get("unloadingSpeed"); + int[] maxProductCapacity = new int[cargo.size()]; + JSONArray jsonCapacity = (JSONArray) jsonDock.get("maxProductCapacity"); + for (int j = 0; j < jsonCapacity.size(); ++j) { + maxProductCapacity[j] = (int) (long) jsonCapacity.get(j); + } + docks.add(new Dock(id, unloadingSpeed, maxProductCapacity)); + } + JSONArray jsonHobos = (JSONArray) jsonObject.get("Hobos"); + for (Object i : jsonHobos) { + JSONObject jsonHob = (JSONObject) i; + int stealingTime = (int) (long) jsonHob.get("stealingTime"); + hobos.add(new Hobos(stealingTime)); + } + JSONObject jsonVillage = (JSONObject) jsonObject.get("hobosVillage"); + int eatingTime = (int) (long) jsonVillage.get("eatingTime"); + JSONArray jsonIngredients = (JSONArray) jsonVillage.get("ingredientsCount"); + int[] requiredIngredientsCount = new int[cargo.size()]; + for (int i = 0; i < jsonIngredients.size(); ++i) { + requiredIngredientsCount[i] = (int) (long) jsonIngredients.get(i); + } + hobosVillage = new HobosVillage(requiredIngredientsCount, eatingTime, hobos); + return new Controller(shipGenerator, hobosVillage, tunnel, cargoDecoder, docks); + } +} diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java similarity index 72% rename from lab-02/src/by/parfen01/docks_and_hobos/Hobos.java rename to lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java index 08647e6..4250c82 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java @@ -1,4 +1,7 @@ -package by.parfen01.docks_and_hobos; +package by.parfen01.docks_and_hobos.hobos; + +import by.parfen01.docks_and_hobos.control.Controller; +import by.parfen01.docks_and_hobos.Dock; import java.util.ArrayList; import java.util.logging.Level; @@ -22,7 +25,7 @@ public void start() throws InterruptedException { } } - public void steal(int product) throws InterruptedException { + private void steal(int product) throws InterruptedException { int dockId = -1; label: while (Controller.getController().isWorking()) { @@ -34,6 +37,10 @@ public void steal(int product) throws InterruptedException { } } } + // нужно для stop(). Если ничего не нашёл, при остановке, то просто возвращается домой, иначе честно доносит до дома + if (dockId == -1 && !Controller.getController().isWorking()) { + return; + } sleep(stealingTime * 1000L); Controller.getController().getConsoleLogger().log( Level.INFO, "Hobos stole " + diff --git a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java similarity index 87% rename from lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java rename to lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java index bf1680f..b1f38d0 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java @@ -1,4 +1,6 @@ -package by.parfen01.docks_and_hobos; +package by.parfen01.docks_and_hobos.hobos; + +import by.parfen01.docks_and_hobos.control.Controller; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicIntegerArray; @@ -74,6 +76,11 @@ public void start() throws InterruptedException { } Controller.getController().getConsoleLogger().log( Level.INFO, "All hobos returned home"); + // нужно для stop(), чтобы не есть, когда бродяги закончили красть из-за остановки системы, + // а не потому что всё украли + if (!Controller.getController().isWorking()) { + break; + } cookAndEat(); } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Ship.java b/lab-02/src/by/parfen01/docks_and_hobos/ships/Ship.java similarity index 86% rename from lab-02/src/by/parfen01/docks_and_hobos/Ship.java rename to lab-02/src/by/parfen01/docks_and_hobos/ships/Ship.java index 4087650..badc799 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Ship.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/ships/Ship.java @@ -1,4 +1,6 @@ -package by.parfen01.docks_and_hobos; +package by.parfen01.docks_and_hobos.ships; + +import by.parfen01.docks_and_hobos.control.Controller; import java.util.logging.Level; diff --git a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java b/lab-02/src/by/parfen01/docks_and_hobos/ships/ShipGenerator.java similarity index 92% rename from lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java rename to lab-02/src/by/parfen01/docks_and_hobos/ships/ShipGenerator.java index 3291f50..62f248d 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/ShipGenerator.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/ships/ShipGenerator.java @@ -1,4 +1,6 @@ -package by.parfen01.docks_and_hobos; +package by.parfen01.docks_and_hobos.ships; + +import by.parfen01.docks_and_hobos.control.Controller; import java.util.ArrayList; import java.util.logging.Level; From 2d21817690bc4db9091e0c95f4b2925724465cc4 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Thu, 1 Dec 2022 17:49:58 +0300 Subject: [PATCH 08/15] Micro optimisation --- lab-02/src/by/parfen01/docks_and_hobos/Main.java | 2 ++ .../parfen01/docks_and_hobos/control/ProjectInitializer.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Main.java b/lab-02/src/by/parfen01/docks_and_hobos/Main.java index 2533da3..b3a8ad0 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Main.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Main.java @@ -11,6 +11,8 @@ public class Main { public static void main(String[] args) throws InterruptedException, IOException, ParseException { String path = args[0]; + // я знаю, что нулевой аргуент это обычно вся строка, а аргументы для команды начинаются с 1, + // просто в идее проще сразу прописать внутри программы путь нулевым аргументом Controller controller = ProjectInitializer.initController(path); controller.start(); sleep(10 * 1000L); diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java index 4982409..0f9a7c1 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java @@ -16,7 +16,12 @@ import java.util.ArrayList; public class ProjectInitializer { + private static String previousPath; public static Controller initController(String path) throws IOException, ParseException { + if (path.equals(previousPath)) { + return Controller.getController(); + } + previousPath = path; ArrayList hobos = new ArrayList<>(); ArrayList cargo = new ArrayList<>(); ArrayList docks = new ArrayList<>(); From bafb049db009eb8f5196f456df46a3cff5652863 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Thu, 1 Dec 2022 17:52:12 +0300 Subject: [PATCH 09/15] Micro fix --- lab-02/src/by/parfen01/docks_and_hobos/Main.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Main.java b/lab-02/src/by/parfen01/docks_and_hobos/Main.java index b3a8ad0..616a438 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Main.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Main.java @@ -10,9 +10,10 @@ public class Main { public static void main(String[] args) throws InterruptedException, IOException, ParseException { + if (args.length != 1) { + throw new IllegalArgumentException("wrong number of arguments"); + } String path = args[0]; - // я знаю, что нулевой аргуент это обычно вся строка, а аргументы для команды начинаются с 1, - // просто в идее проще сразу прописать внутри программы путь нулевым аргументом Controller controller = ProjectInitializer.initController(path); controller.start(); sleep(10 * 1000L); From c42993e7b020e587b6e00e1632f2048d35b42c37 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Thu, 1 Dec 2022 20:11:00 +0300 Subject: [PATCH 10/15] Add more information --- .../src/by/parfen01/docks_and_hobos/Dock.java | 2 +- .../src/by/parfen01/docks_and_hobos/config.json | 17 +++++++++++------ .../control/ProjectInitializer.java | 3 ++- .../parfen01/docks_and_hobos/hobos/Hobos.java | 10 ++++++++-- .../docks_and_hobos/hobos/HobosVillage.java | 4 ++++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java index 4292dbe..f619a79 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Dock.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Dock.java @@ -36,7 +36,7 @@ public void UnloadShip(Ship ship) throws InterruptedException { public void start() throws InterruptedException { Controller.getController().getConsoleLogger().log( Level.INFO, "Dock number " + id + " started to work"); - while(Controller.getController().isWorking()) { + while (Controller.getController().isWorking()) { UnloadShip(Controller.getController().getTunnel().getShip()); } } diff --git a/lab-02/src/by/parfen01/docks_and_hobos/config.json b/lab-02/src/by/parfen01/docks_and_hobos/config.json index 481fab8..14e1668 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/config.json +++ b/lab-02/src/by/parfen01/docks_and_hobos/config.json @@ -2,7 +2,7 @@ "ShipGenerator" : { "shipCapacityMin" : 1, "shipCapacityMax" : 100, - "generatingTime" : 7, + "generatingTime" : 10, "cargoTypes" : [ "milk", "meat", @@ -38,19 +38,24 @@ ], "Hobos" : [ { - "stealingTime" : 7 + "stealingTime" : 7, + "name" : "Ivan" }, { - "stealingTime" : 2 + "stealingTime" : 2, + "name" : "Vlad" }, { - "stealingTime" : 1 + "stealingTime" : 1, + "name" : "Danil" }, { - "stealingTime" : 5 + "stealingTime" : 5, + "name" : "Nicolay" }, { - "stealingTime" : 3 + "stealingTime" : 3, + "name" : "Jon" } ], "hobosVillage" : { diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java index 0f9a7c1..2c26d9b 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java @@ -58,7 +58,8 @@ public static Controller initController(String path) throws IOException, ParseEx for (Object i : jsonHobos) { JSONObject jsonHob = (JSONObject) i; int stealingTime = (int) (long) jsonHob.get("stealingTime"); - hobos.add(new Hobos(stealingTime)); + String name = (String) jsonHob.get("name"); + hobos.add(new Hobos(stealingTime, name)); } JSONObject jsonVillage = (JSONObject) jsonObject.get("hobosVillage"); int eatingTime = (int) (long) jsonVillage.get("eatingTime"); diff --git a/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java index 4250c82..f7f375b 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java @@ -10,9 +10,15 @@ public class Hobos { private final int stealingTime; + private final String name; - public Hobos(int stealingTime) { + public Hobos(int stealingTime, String name) { this.stealingTime = stealingTime; + this.name = name; + } + + public String getName() { + return name; } public void start() throws InterruptedException { @@ -43,7 +49,7 @@ private void steal(int product) throws InterruptedException { } sleep(stealingTime * 1000L); Controller.getController().getConsoleLogger().log( - Level.INFO, "Hobos stole " + + Level.INFO, "Hobos " + name + " stole " + Controller.getController().getCargoDecoder().getProductName(product) + " from dock number " + dockId); Controller.getController().getHobosVillage() diff --git a/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java index b1f38d0..ebe268d 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java @@ -54,6 +54,10 @@ public void start() throws InterruptedException { if (secondCook == firstCook) { secondCook = (secondCook + 1) % hobos.size(); } + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos " + hobos.get(firstCook).getName() + " is first cook"); + Controller.getController().getConsoleLogger().log( + Level.INFO, "Hobos " + hobos.get(secondCook).getName() + " is second cook"); ArrayList threads = new ArrayList<>(); Controller.getController().getConsoleLogger().log( Level.INFO, "Hobos started to steal"); From 5ba47a8c55ed53700dfbfbc651591bf424e56c43 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Fri, 2 Dec 2022 13:54:59 +0300 Subject: [PATCH 11/15] Fix main bug and rename --- lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java | 2 +- .../docks_and_hobos/control/ProjectInitializer.java | 12 ++++++------ .../docks_and_hobos/hobos/{Hobos.java => Hobo.java} | 6 +++--- .../parfen01/docks_and_hobos/hobos/HobosVillage.java | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) rename lab-02/src/by/parfen01/docks_and_hobos/hobos/{Hobos.java => Hobo.java} (93%) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java index cab5320..72ea3a0 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -30,7 +30,7 @@ public synchronized void addShip(Ship ship) { } public synchronized Ship getShip() throws InterruptedException { - if (shipQueue.isEmpty()) { + while (shipQueue.isEmpty()) { wait(); } Ship result = shipQueue.poll(); diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java index 2c26d9b..0722040 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java @@ -3,7 +3,7 @@ import by.parfen01.docks_and_hobos.CargoDecoder; import by.parfen01.docks_and_hobos.Dock; import by.parfen01.docks_and_hobos.Tunnel; -import by.parfen01.docks_and_hobos.hobos.Hobos; +import by.parfen01.docks_and_hobos.hobos.Hobo; import by.parfen01.docks_and_hobos.hobos.HobosVillage; import by.parfen01.docks_and_hobos.ships.ShipGenerator; import org.json.simple.JSONArray; @@ -22,7 +22,7 @@ public static Controller initController(String path) throws IOException, ParseEx return Controller.getController(); } previousPath = path; - ArrayList hobos = new ArrayList<>(); + ArrayList hobos = new ArrayList<>(); ArrayList cargo = new ArrayList<>(); ArrayList docks = new ArrayList<>(); ShipGenerator shipGenerator; @@ -56,10 +56,10 @@ public static Controller initController(String path) throws IOException, ParseEx } JSONArray jsonHobos = (JSONArray) jsonObject.get("Hobos"); for (Object i : jsonHobos) { - JSONObject jsonHob = (JSONObject) i; - int stealingTime = (int) (long) jsonHob.get("stealingTime"); - String name = (String) jsonHob.get("name"); - hobos.add(new Hobos(stealingTime, name)); + JSONObject jsonHobo = (JSONObject) i; + int stealingTime = (int) (long) jsonHobo.get("stealingTime"); + String name = (String) jsonHobo.get("name"); + hobos.add(new Hobo(stealingTime, name)); } JSONObject jsonVillage = (JSONObject) jsonObject.get("hobosVillage"); int eatingTime = (int) (long) jsonVillage.get("eatingTime"); diff --git a/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobo.java similarity index 93% rename from lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java rename to lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobo.java index f7f375b..d51a40d 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobos.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/Hobo.java @@ -8,11 +8,11 @@ import static java.lang.Thread.sleep; -public class Hobos { +public class Hobo { private final int stealingTime; private final String name; - public Hobos(int stealingTime, String name) { + public Hobo(int stealingTime, String name) { this.stealingTime = stealingTime; this.name = name; } @@ -49,7 +49,7 @@ private void steal(int product) throws InterruptedException { } sleep(stealingTime * 1000L); Controller.getController().getConsoleLogger().log( - Level.INFO, "Hobos " + name + " stole " + + Level.INFO, "Hobo " + name + " stole " + Controller.getController().getCargoDecoder().getProductName(product) + " from dock number " + dockId); Controller.getController().getHobosVillage() diff --git a/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java index ebe268d..cabc6db 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/hobos/HobosVillage.java @@ -12,9 +12,9 @@ public class HobosVillage { private final int[] requiredIngredientsCount; private final AtomicIntegerArray currentIngredientsCount; private final int eatingTime; - private final ArrayList hobos; + private final ArrayList hobos; - public HobosVillage(int[] requiredIngredientsCount, int eatingTime, ArrayList hobos) { + public HobosVillage(int[] requiredIngredientsCount, int eatingTime, ArrayList hobos) { this.requiredIngredientsCount = requiredIngredientsCount; this.eatingTime = eatingTime; this.hobos = hobos; @@ -55,9 +55,9 @@ public void start() throws InterruptedException { secondCook = (secondCook + 1) % hobos.size(); } Controller.getController().getConsoleLogger().log( - Level.INFO, "Hobos " + hobos.get(firstCook).getName() + " is first cook"); + Level.INFO, "Hobo " + hobos.get(firstCook).getName() + " is first cook"); Controller.getController().getConsoleLogger().log( - Level.INFO, "Hobos " + hobos.get(secondCook).getName() + " is second cook"); + Level.INFO, "Hobo " + hobos.get(secondCook).getName() + " is second cook"); ArrayList threads = new ArrayList<>(); Controller.getController().getConsoleLogger().log( Level.INFO, "Hobos started to steal"); From fc04081cb4ee955b41d09ce968a4fc9151590303 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Fri, 2 Dec 2022 15:50:35 +0300 Subject: [PATCH 12/15] Make tunnel self sufficient --- lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java index 72ea3a0..2f1213e 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/Tunnel.java @@ -22,9 +22,7 @@ public synchronized void addShip(Ship ship) { return; } shipQueue.add(ship); - if (shipQueue.size() == 1) { - notify(); - } + notify(); Controller.getController().getConsoleLogger().log( Level.INFO, "The ship number " + ship.getId() + " entered tunnel"); } From 6982b4aa09d8e80efb3aa2da77c90e2f1ad51136 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Fri, 2 Dec 2022 16:00:33 +0300 Subject: [PATCH 13/15] Made logger synchronized --- .../src/by/parfen01/docks_and_hobos/control/Controller.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java index b103a5f..601fc13 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java @@ -53,7 +53,10 @@ public CargoDecoder getCargoDecoder() { public ArrayList getDocks() { return docks; } - public Logger getConsoleLogger() { + // synchronized нужен для того, чтобы логировалось всё в нужной последовательности + // в частности, чтобы после стопа не логировались вещи, которые произошли до него, ибо это странно + // в остальном, вроде, порядок логирования не принципиален + public synchronized Logger getConsoleLogger() { return consoleLogger; } From a1b30337e8e01336c81cf6fdd8010e2bcb84a246 Mon Sep 17 00:00:00 2001 From: parfen01 Date: Fri, 2 Dec 2022 16:38:29 +0300 Subject: [PATCH 14/15] Revert last commit --- .../src/by/parfen01/docks_and_hobos/control/Controller.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java index 601fc13..1871b23 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/Controller.java @@ -53,10 +53,8 @@ public CargoDecoder getCargoDecoder() { public ArrayList getDocks() { return docks; } - // synchronized нужен для того, чтобы логировалось всё в нужной последовательности - // в частности, чтобы после стопа не логировались вещи, которые произошли до него, ибо это странно - // в остальном, вроде, порядок логирования не принципиален - public synchronized Logger getConsoleLogger() { + + public Logger getConsoleLogger() { return consoleLogger; } From ddea26eaee4f9d50ceb301dd5bd789f191e419fc Mon Sep 17 00:00:00 2001 From: parfen01 Date: Fri, 9 Dec 2022 23:38:06 +0300 Subject: [PATCH 15/15] Remove useless code --- .../parfen01/docks_and_hobos/control/ProjectInitializer.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java index 0722040..b1c2b87 100644 --- a/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java +++ b/lab-02/src/by/parfen01/docks_and_hobos/control/ProjectInitializer.java @@ -16,12 +16,7 @@ import java.util.ArrayList; public class ProjectInitializer { - private static String previousPath; public static Controller initController(String path) throws IOException, ParseException { - if (path.equals(previousPath)) { - return Controller.getController(); - } - previousPath = path; ArrayList hobos = new ArrayList<>(); ArrayList cargo = new ArrayList<>(); ArrayList docks = new ArrayList<>();