From eb269aa1f39527f35de8c02c14d65a33c2efd612 Mon Sep 17 00:00:00 2001 From: Teryaev Sergey Date: Mon, 16 Jul 2018 22:19:21 +1100 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B4=D0=B7=20=D0=BA=205=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=20(=D1=81=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=BE=D0=BC=20Synchronizer)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson_05/src/homework/Car.java | 14 +++++++++++++- lesson_05/src/homework/MainClass.java | 20 ++++++++++++++++++-- lesson_05/src/homework/Race.java | 8 ++++++++ lesson_05/src/homework/Tunnel.java | 9 ++++++++- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lesson_05/src/homework/Car.java b/lesson_05/src/homework/Car.java index 3459866..4b86ab8 100644 --- a/lesson_05/src/homework/Car.java +++ b/lesson_05/src/homework/Car.java @@ -1,5 +1,7 @@ package homework; +import java.util.concurrent.BrokenBarrierException; + public class Car implements Runnable { private static int CARS_COUNT; @@ -10,12 +12,14 @@ public class Car implements Runnable { private Race race; private int speed; private String name; + private Synchronizer synch; - public Car(Race race, int speed) { + public Car(Race race, int speed, Synchronizer synch) { this.race = race; this.speed = speed; CARS_COUNT++; this.name = "Участник #" + CARS_COUNT; + this.synch = synch; } public String getName() { @@ -32,11 +36,19 @@ public void run() { System.out.println(this.name + " готовится"); Thread.sleep(500 + (int) (Math.random() * 800)); System.out.println(this.name + " готов"); + synch.ready.countDown(); + synch.start.await(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < race.getStages().size(); i++) { race.getStages().get(i).go(this); } + race.winDetermination(this); + try { + synch.finish.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } } } diff --git a/lesson_05/src/homework/MainClass.java b/lesson_05/src/homework/MainClass.java index d7e2601..163dbdd 100644 --- a/lesson_05/src/homework/MainClass.java +++ b/lesson_05/src/homework/MainClass.java @@ -1,19 +1,35 @@ package homework; +import java.util.concurrent.BrokenBarrierException; + public class MainClass { public static final int CARS_COUNT = 4; public static void main(String[] args) { System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Подготовка!!!"); - Race race = new Race(new Road(60), new Tunnel(), new Road(40)); + Race race = new Race(new Road(60), new Tunnel(CARS_COUNT), new Road(40)); Car[] cars = new Car[CARS_COUNT]; + + Synchronizer synch = new Synchronizer(CARS_COUNT, 1, CARS_COUNT + 1); + for (int i = 0; i < cars.length; i++) { - cars[i] = new Car(race, 20 + (int) (Math.random() * 10)); + cars[i] = new Car(race, 20 + (int) (Math.random() * 10), synch); } for (int i = 0; i < cars.length; i++) { new Thread(cars[i]).start(); } + try { + synch.ready.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка началась!!!"); + synch.start.countDown(); + try { + synch.finish.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!"); } } diff --git a/lesson_05/src/homework/Race.java b/lesson_05/src/homework/Race.java index c0da33c..2addaae 100644 --- a/lesson_05/src/homework/Race.java +++ b/lesson_05/src/homework/Race.java @@ -5,6 +5,7 @@ public class Race { private ArrayList stages; + private Car winner; public Race(Stage... stages) { this.stages = new ArrayList<>(Arrays.asList(stages)); @@ -13,4 +14,11 @@ public Race(Stage... stages) { public ArrayList getStages() { return stages; } + + public synchronized void winDetermination(Car win){ + if (winner == null){ + winner = win; + System.out.println(winner.getName() + " WIN"); + } + } } diff --git a/lesson_05/src/homework/Tunnel.java b/lesson_05/src/homework/Tunnel.java index 56ef42c..40bdf18 100644 --- a/lesson_05/src/homework/Tunnel.java +++ b/lesson_05/src/homework/Tunnel.java @@ -1,9 +1,14 @@ package homework; +import java.util.concurrent.Semaphore; + public class Tunnel extends Stage { - public Tunnel() { + Semaphore sem; + + public Tunnel(int carsCount) { this.length = 80; this.description = "Тоннель " + length + " метров"; + sem = new Semaphore(carsCount / 2); } @Override @@ -12,6 +17,7 @@ public void go(Car c) { try { System.out.println(c.getName() + " готовится к этапу(ждет): " + description); + sem.acquire(); System.out.println(c.getName() + " начал этап: " + description); Thread.sleep(length / c.getSpeed() * 1000); } catch (InterruptedException e) { @@ -19,6 +25,7 @@ public void go(Car c) { } finally { System.out.println(c.getName() + " закончил этап: " + description); + sem.release(); } } catch (Exception e) { e.printStackTrace(); From 624275015d1dbd1e0a042742cd1ae57d41b4d779 Mon Sep 17 00:00:00 2001 From: Teryaev Sergey Date: Mon, 16 Jul 2018 22:59:57 +1100 Subject: [PATCH 2/2] =?UTF-8?q?=D0=B4=D0=B7=20=D0=BA=205=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=20(=D1=81=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=BE=D0=BC=20Synchronizer)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson_05/src/homework/Race.java | 2 +- lesson_05/src/homework/Synchronizer.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 lesson_05/src/homework/Synchronizer.java diff --git a/lesson_05/src/homework/Race.java b/lesson_05/src/homework/Race.java index 2addaae..ad64890 100644 --- a/lesson_05/src/homework/Race.java +++ b/lesson_05/src/homework/Race.java @@ -18,7 +18,7 @@ public ArrayList getStages() { public synchronized void winDetermination(Car win){ if (winner == null){ winner = win; - System.out.println(winner.getName() + " WIN"); + System.out.println(winner.getName() + " - WIN"); } } } diff --git a/lesson_05/src/homework/Synchronizer.java b/lesson_05/src/homework/Synchronizer.java new file mode 100644 index 0000000..6fc573d --- /dev/null +++ b/lesson_05/src/homework/Synchronizer.java @@ -0,0 +1,16 @@ +package homework; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; + +public class Synchronizer { + public CountDownLatch ready; + public CountDownLatch start; + public CyclicBarrier finish; + + public Synchronizer(int ready, int start, int finish) { + this.ready = new CountDownLatch(ready); + this.start = new CountDownLatch(start); + this.finish = new CyclicBarrier(finish); + } +}