Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions src/lesson5/Car.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
36 changes: 36 additions & 0 deletions src/lesson5/MainClass.java
Original file line number Diff line number Diff line change
@@ -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 <cars.length ; i++) {
new Thread(cars[i]).start();
}

try{
cb.await();
System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка началась!!!");
cb.await();
cb.await();
}catch (InterruptedException e){
e.printStackTrace();
}catch (BrokenBarrierException e){
e.printStackTrace();
}
System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!");
}
}
16 changes: 16 additions & 0 deletions src/lesson5/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package lesson5;

import java.util.ArrayList;
import java.util.Arrays;

public class Race {
private ArrayList<Stage> stages;

public ArrayList<Stage> getStages(){
return stages;
}

public Race(Stage...stages){
this.stages = new ArrayList<>(Arrays.asList(stages));
}
}
19 changes: 19 additions & 0 deletions src/lesson5/Road.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
14 changes: 14 additions & 0 deletions src/lesson5/Stage.java
Original file line number Diff line number Diff line change
@@ -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);
}
26 changes: 26 additions & 0 deletions src/lesson5/Tunnel.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}