From 792fff7519f2df2e8dd841b4d23a170e8c74e735 Mon Sep 17 00:00:00 2001 From: qdo_ln <4yu@bk.ru> Date: Thu, 25 Jul 2019 02:58:02 +0300 Subject: [PATCH] Java3 lesson 5 homework. --- src/lesson5/Car.java | 56 ++++++++++++++++++++++++++++++++++++++ src/lesson5/MainClass.java | 36 ++++++++++++++++++++++++ src/lesson5/Race.java | 16 +++++++++++ src/lesson5/Road.java | 19 +++++++++++++ src/lesson5/Stage.java | 14 ++++++++++ src/lesson5/Tunnel.java | 26 ++++++++++++++++++ 6 files changed, 167 insertions(+) create mode 100644 src/lesson5/Car.java create mode 100644 src/lesson5/MainClass.java create mode 100644 src/lesson5/Race.java create mode 100644 src/lesson5/Road.java create mode 100644 src/lesson5/Stage.java create mode 100644 src/lesson5/Tunnel.java diff --git a/src/lesson5/Car.java b/src/lesson5/Car.java new file mode 100644 index 0000000..fb5c835 --- /dev/null +++ b/src/lesson5/Car.java @@ -0,0 +1,56 @@ +package lesson5; + +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.atomic.AtomicInteger; + +public class Car implements Runnable { + private static int CARS_COUNT; + static { + CARS_COUNT = 0; + } + private Race race; + private int speed; + private String name; + private CyclicBarrier carcb; + private static AtomicInteger ai = new AtomicInteger(0); + + public int getSpeed() { + return speed; + } + + public String getName() { + return name; + } + + public Car (Race race, int speed, CyclicBarrier cyclicBarrier){ + this.race = race; + this.speed = speed; + CARS_COUNT++; + this.name = "Участник №" + CARS_COUNT; + this.carcb = cyclicBarrier; + + } + + @Override + public void run() { + try { + System.out.println(this.name + " готовится"); + Thread.sleep(500 + (int)(Math.random()*800)); + System.out.println(this.name + " готов"); + carcb.await(); + carcb.await(); + for (int i = 0; i < race.getStages().size(); i++) { + race.getStages().get(i).go(this); + } + if (ai.incrementAndGet() == 1){ + System.out.println("ПОБЕДИТЕЛЬ - " + name); + } + carcb.await(); + }catch (InterruptedException e){ + e.printStackTrace(); + }catch (BrokenBarrierException e){ + e.printStackTrace(); + } + } +} diff --git a/src/lesson5/MainClass.java b/src/lesson5/MainClass.java new file mode 100644 index 0000000..17133e4 --- /dev/null +++ b/src/lesson5/MainClass.java @@ -0,0 +1,36 @@ +package lesson5; + + +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.Semaphore; + +public class MainClass { + public static final int CARS_COUNT = 4; + static Semaphore smp = new Semaphore(CARS_COUNT/2); + static CyclicBarrier cb = new CyclicBarrier(CARS_COUNT + 1); + + public static void main(String[] args) { + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Подготовка!!!"); + Race race = new Race(new Road(60), new Tunnel(), new Road(40)); + Car[] cars = new Car[CARS_COUNT]; + for (int i = 0; i < cars.length; i++) { + cars[i] = new Car(race, 20 + (int)(Math.random()*10), cb); + } + for (int i = 0; i >> Гонка началась!!!"); + cb.await(); + cb.await(); + }catch (InterruptedException e){ + e.printStackTrace(); + }catch (BrokenBarrierException e){ + e.printStackTrace(); + } + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!"); + } +} diff --git a/src/lesson5/Race.java b/src/lesson5/Race.java new file mode 100644 index 0000000..28bcffa --- /dev/null +++ b/src/lesson5/Race.java @@ -0,0 +1,16 @@ +package lesson5; + +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/src/lesson5/Road.java b/src/lesson5/Road.java new file mode 100644 index 0000000..d590791 --- /dev/null +++ b/src/lesson5/Road.java @@ -0,0 +1,19 @@ +package lesson5; + +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(); + } + } +} diff --git a/src/lesson5/Stage.java b/src/lesson5/Stage.java new file mode 100644 index 0000000..9c5dd95 --- /dev/null +++ b/src/lesson5/Stage.java @@ -0,0 +1,14 @@ +package lesson5; + +import lesson5.Car; + +public abstract class Stage { + protected int length; + protected String description; + + public String getDescription(){ + return description; + } + + public abstract void go(Car c); +} diff --git a/src/lesson5/Tunnel.java b/src/lesson5/Tunnel.java new file mode 100644 index 0000000..c53a32f --- /dev/null +++ b/src/lesson5/Tunnel.java @@ -0,0 +1,26 @@ +package lesson5; + +public class Tunnel extends Stage { + public Tunnel(){ + this.length = 80; + this.description = " Тоннель " + length + " метров"; + } + @Override + public void go(Car c) { + try { + try { + System.out.println(c.getName() + " готовится к этапу (ждёт): " + description); + MainClass.smp.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); + MainClass.smp.release(); + } + }catch (Exception e){ + e.printStackTrace(); + } + } +}