From 0d1a75266fd3aa1b63323ff18d5152e83a890046 Mon Sep 17 00:00:00 2001 From: Volha Date: Tue, 9 Mar 2021 11:30:46 +0200 Subject: [PATCH 1/5] The task with threads is completed, but I don't know how to print "END once" --- .../src/main/java/race/Car.java | 49 +++++++++++++++++ .../src/main/java/race/Finish.java | 36 +++++++++++++ .../src/main/java/race/MainClass.java | 30 +++++++++++ .../src/main/java/race/Race.java | 13 +++++ .../src/main/java/race/RaceGoing.java | 52 +++++++++++++++++++ .../src/main/java/race/Road.java | 19 +++++++ .../src/main/java/race/Stage.java | 10 ++++ .../src/main/java/race/Tunnel.java | 29 +++++++++++ 8 files changed, 238 insertions(+) create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Race.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Road.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Stage.java create mode 100644 org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Tunnel.java diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java new file mode 100644 index 0000000..8a30e37 --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java @@ -0,0 +1,49 @@ +package race; + +//import static race.MainClass.cbStartRace; + +import static race.RaceGoing.newBarrier; + +public class Car implements Runnable { + private static int CARS_COUNT; + + static { + CARS_COUNT = 4; + } + + private Race race; + private int speed; + private String name; + + + public String getName() { + return name; + } + + public int getSpeed() { + return speed; + } + + public Car(int speed, int carNumber, Race race) { + this.race = race; + this.speed = speed; + this.name = "Участник #" + carNumber; + } + + @Override + public void run() { + try { + System.out.println(this.name + " готовится"); + Thread.sleep(500 + (int) (Math.random() * 800)); + System.out.println(this.name + " готов"); + newBarrier.await(); + } catch (Exception e) { + e.printStackTrace(); + } + for ( Stage stage : race.getStages() ) { + stage.go(this); + } + } +} + + diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java new file mode 100644 index 0000000..2f37874 --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java @@ -0,0 +1,36 @@ +package race; + +import java.util.concurrent.BrokenBarrierException; + +public class Finish extends Stage { + volatile boolean winnner = false; + + public Finish() { + this.description = "Finish"; + } + + @Override + public void go(Car c) { + System.out.println(c.getName() + " начал этап: " + description); + System.out.println(c.getName() + " закончил этап: " + description); + if (!winnner) { + System.out.println(c.getName() + " WON"); + winnner = true; + } + try { + RaceGoing.newFinishBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + finally { + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> The race is finished!!!"); + + } + } +} + + + + diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java new file mode 100644 index 0000000..6de5a68 --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java @@ -0,0 +1,30 @@ +package race; +//Организуем гонки: +// Все участники должны стартовать одновременно, несмотря на то, что на подготовку у каждого из них уходит разное время. +// В туннель не может заехать одновременно больше половины участников (условность). +// Попробуйте всё это синхронизировать. +// Только после того как все завершат гонку, нужно выдать объявление об окончании. +// Можете корректировать классы (в т.ч. конструктор машин) и добавлять объекты классов из пакета util.concurrent. + +import java.util.concurrent.BrokenBarrierException; + +public class MainClass { + public static void main(String[] args) throws InterruptedException { + // parent thread + RaceGoing raceGoing = new RaceGoing(); + + Thread t1 = new Thread(raceGoing); + t1.start(); +// try { +// RaceGoing.newFinishBarrier.await(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } catch (BrokenBarrierException e) { +// e.printStackTrace(); +// } +// System.out.println("FIN"); +// t1.join(); +// System.out.println("FINISH"); + // System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!"); + } +} diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Race.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Race.java new file mode 100644 index 0000000..9ec35b7 --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Race.java @@ -0,0 +1,13 @@ +package race; + +import java.util.ArrayList; +import java.util.Arrays; + +public class Race { + private ArrayList stages; + public ArrayList getStages() { return stages; } + public Race(Stage... stages) { + this.stages = new ArrayList<>(Arrays.asList(stages)); + } + } + diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java new file mode 100644 index 0000000..bb0142b --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java @@ -0,0 +1,52 @@ +package race; + +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.Lock; + +public class RaceGoing implements Runnable { + public static final int CARS_COUNT = 4; + public static CyclicBarrier newBarrier = new CyclicBarrier(CARS_COUNT + 1); + public static CyclicBarrier newFinishBarrier = new CyclicBarrier(CARS_COUNT); + public static Lock lock; + public static Car[] cars; + public static Semaphore tunnelSemaphore = new Semaphore(CARS_COUNT / 2); + + @Override + public void run() { + System.out.println("Number of parties required to trip the barrier = " + + newBarrier.getParties()); + + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Подготовка!!!"); + Race race = new Race(new Road(60), new Tunnel(80), new Road(40), new Finish()); + cars = new Car[CARS_COUNT]; + for ( int i = 0; i < cars.length; i++ ) { + cars[i] = new Car(20 + (int) (Math.random() * 10), i + 1, race); + } + for ( int i = 0; i < cars.length; i++ ) { + new Thread(cars[i]).start(); + } + + try { + RaceGoing.newBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + System.out.println("Race begun"); + + // Resetting the newBarrier + newBarrier.reset(); + System.out.println("Barrier reset successful"); + //RaceGoing.newBarrier.await(); +// try { +// newFinishBarrier.await(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } catch (BrokenBarrierException e) { +// e.printStackTrace(); +// } + + } +} + diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Road.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Road.java new file mode 100644 index 0000000..15cad8b --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Road.java @@ -0,0 +1,19 @@ +package race; + +public class Road extends Stage { + public Road(int length) { + this.length = length; + this.description = "Дорога " + length + " метров"; + } + + @Override + public void go(Car c) { + try { + System.out.println(c.getName() + " начал этап: " + description); + Thread.sleep(length / c.getSpeed() * 1000); + System.out.println(c.getName() + " закончил этап: " + description); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Stage.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Stage.java new file mode 100644 index 0000000..1661a4e --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Stage.java @@ -0,0 +1,10 @@ +package race; +public abstract class Stage { + protected int length; + protected String description; + public String getDescription() { + return description; + } + public abstract void go(Car c); +} + diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Tunnel.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Tunnel.java new file mode 100644 index 0000000..cc02ec0 --- /dev/null +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Tunnel.java @@ -0,0 +1,29 @@ +package race; + +import static race.RaceGoing.tunnelSemaphore; + +public class Tunnel extends Stage { + public Tunnel(int tunnelLength) { + this.length = tunnelLength; + this.description = "Тоннель " + length + " метров"; + } + + @Override + public void go(Car c) { + try { + try { + System.out.println(c.getName() + " готовится к этапу(ждет): " + description); + tunnelSemaphore.acquire(); + System.out.println(c.getName() + " начал этап: " + description); + Thread.sleep(length / c.getSpeed() * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + System.out.println(c.getName() + " закончил этап: " + description); + tunnelSemaphore.release(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From 5f8f9cd1c84d7b027dc4559d405fef82a67d871c Mon Sep 17 00:00:00 2001 From: Volha Date: Tue, 9 Mar 2021 21:47:48 +0200 Subject: [PATCH 2/5] The end is working, but sometimes there are twi winners... --- .../src/main/java/race/Car.java | 9 ++++++++ .../src/main/java/race/Finish.java | 15 ++---------- .../src/main/java/race/MainClass.java | 11 --------- .../src/main/java/race/RaceGoing.java | 23 ++++++++----------- 4 files changed, 20 insertions(+), 38 deletions(-) diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java index 8a30e37..129a9a0 100644 --- a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Car.java @@ -2,6 +2,8 @@ //import static race.MainClass.cbStartRace; +import java.util.concurrent.BrokenBarrierException; + import static race.RaceGoing.newBarrier; public class Car implements Runnable { @@ -43,6 +45,13 @@ public void run() { for ( Stage stage : race.getStages() ) { stage.go(this); } + try { + newBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } } } diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java index 2f37874..811bdee 100644 --- a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java @@ -14,20 +14,9 @@ public void go(Car c) { System.out.println(c.getName() + " начал этап: " + description); System.out.println(c.getName() + " закончил этап: " + description); if (!winnner) { - System.out.println(c.getName() + " WON"); winnner = true; - } - try { - RaceGoing.newFinishBarrier.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (BrokenBarrierException e) { - e.printStackTrace(); - } - finally { - System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> The race is finished!!!"); - - } + System.out.println(c.getName() + " WON "); + } } } diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java index 6de5a68..18c15a0 100644 --- a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/MainClass.java @@ -15,16 +15,5 @@ public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(raceGoing); t1.start(); -// try { -// RaceGoing.newFinishBarrier.await(); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } catch (BrokenBarrierException e) { -// e.printStackTrace(); -// } -// System.out.println("FIN"); -// t1.join(); -// System.out.println("FINISH"); - // System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!"); } } diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java index bb0142b..81b9721 100644 --- a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/RaceGoing.java @@ -29,24 +29,19 @@ public void run() { } try { - RaceGoing.newBarrier.await(); + newBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } System.out.println("Race begun"); - - // Resetting the newBarrier - newBarrier.reset(); - System.out.println("Barrier reset successful"); - //RaceGoing.newBarrier.await(); -// try { -// newFinishBarrier.await(); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } catch (BrokenBarrierException e) { -// e.printStackTrace(); -// } - + try { + newBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + System.out.println("The race is finished"); } } From ef238a903fa39f0a826bd30ee6afc95f9be8c00e Mon Sep 17 00:00:00 2001 From: Volha Date: Wed, 10 Mar 2021 07:50:32 +0200 Subject: [PATCH 3/5] Threads II hw. Race --- .../threadracefromexample/src/main/java/race/Finish.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java index 811bdee..3295c99 100644 --- a/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java +++ b/org.volha.geekbrains.java.level3/threadracefromexample/src/main/java/race/Finish.java @@ -1,9 +1,10 @@ package race; import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.atomic.AtomicBoolean; public class Finish extends Stage { - volatile boolean winnner = false; + AtomicBoolean winner = new AtomicBoolean(false); public Finish() { this.description = "Finish"; @@ -13,8 +14,8 @@ public Finish() { public void go(Car c) { System.out.println(c.getName() + " начал этап: " + description); System.out.println(c.getName() + " закончил этап: " + description); - if (!winnner) { - winnner = true; + if (!winner.get()) { + winner.set(true); System.out.println(c.getName() + " WON "); } } From 684610f03dd48d027759622a5739c4724dbc44cb Mon Sep 17 00:00:00 2001 From: Volha Date: Wed, 10 Mar 2021 14:06:15 +0200 Subject: [PATCH 4/5] Java level 3 lesson2 hw - db --- .../src/main/java/client/Controller.java | 2 +- .../client/src/main/java/client/Main.java | 2 +- .../src/main/java/client/RegController.java | 5 +- .../client/target/classes/css/style.css | 3 + .../client/target/classes/reg.fxml | 26 ++++ .../client/target/classes/sample.fxml | 34 +++++ .../target/maven-archiver/pom.properties | 5 + .../target/maven-archiver/pom.properties | 5 + .../chat_geekchat_16012021/main.db | Bin 20967424 -> 20967424 bytes .../src/main/java/server/AuthService.java | 1 + .../src/main/java/server/ClientHandler.java | 4 +- .../src/main/java/server/DBAuthService.java | 134 ++---------------- .../server/src/main/java/server/DBMain.java | 111 ++++----------- .../server/src/main/java/server/Server.java | 10 +- .../main/java/server/SimpleAuthService.java | 10 +- .../target/maven-archiver/pom.properties | 5 + 16 files changed, 135 insertions(+), 222 deletions(-) create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/css/style.css create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/reg.fxml create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/sample.fxml create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/maven-archiver/pom.properties create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/command/target/maven-archiver/pom.properties create mode 100644 org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/server/target/maven-archiver/pom.properties diff --git a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Controller.java b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Controller.java index cf9a065..75b31c0 100644 --- a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Controller.java +++ b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Controller.java @@ -143,7 +143,7 @@ private void connect() { String[] tokens = str.split("\\s"); Platform.runLater(() -> { clientList.getItems().clear(); - for (int i = 1; i < tokens.length; i++) { + for ( int i = 1; i < tokens.length; i++ ) { clientList.getItems().add(tokens[i]); } }); diff --git a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Main.java b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Main.java index 2593306..15d3045 100644 --- a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Main.java +++ b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/Main.java @@ -9,7 +9,7 @@ public class Main extends Application { @Override - public void start(Stage primaryStage) throws Exception{ + public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml")); primaryStage.setTitle("GeekChat"); primaryStage.setScene(new Scene(root, 400, 350)); diff --git a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/RegController.java b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/RegController.java index 2cb0340..3a7b9a5 100644 --- a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/RegController.java +++ b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/src/main/java/client/RegController.java @@ -24,10 +24,11 @@ public void tryToReg(ActionEvent actionEvent) { controller.tryToReg(login, password, nickname); } - public void regOk(){ + public void regOk() { textArea.appendText("Регистрация прошла успешно\n"); } - public void regNo(){ + + public void regNo() { textArea.appendText("Логин или никнейм уже заняты\n"); } diff --git a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/css/style.css b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/css/style.css new file mode 100644 index 0000000..88225fa --- /dev/null +++ b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/css/style.css @@ -0,0 +1,3 @@ +.root{ + -fx-font-size: 16; +} \ No newline at end of file diff --git a/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/reg.fxml b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/reg.fxml new file mode 100644 index 0000000..5a786d7 --- /dev/null +++ b/org.volha.geekbrains.java.level3/org.volha.geekbrains.java.level3.dbase/chat_geekchat_16012021 (4)/chat_geekchat_16012021/client/target/classes/reg.fxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + +