/
fedion
/
hw1
Обзор
Документация
Войти
/
fedion
/
hw1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
answer
src/main/java/org/example/Truck.java
86 строк
2 KB
Ioann
реализация hw1
12 окт 2025, 17:24
12 окт 2025, 17:24
955a6a5
Код
Авторство
О чём код?
package org.example; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Log4j2 @Getter public class Truck extends Thread { private final int capacity; private final List<Block> blocks; private final Queue<Warehouse> routeList = new LinkedList<>(); private final long travelTime = Math.round(Math.random() * 2000); private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); @Setter private boolean ready = false; public Truck(String name, int capacity, List<Warehouse> route) { super(name); this.capacity = capacity; this.blocks = new ArrayList<>(capacity); this.routeList.addAll(route); } /** * Логика работы грузовика: * Пока есть точки в маршруте, берем следующую точку. * Ожидаем время travelTime и запускаем процедуру прибытия на склад. */ @Override public void run() { log.info("Truck started"); while (!routeList.isEmpty()) { Warehouse warehouse = routeList.poll(); travel(warehouse); warehouse.arrive(this); log.info("Truck {} ехал из {}", this.getName(), warehouse.getName()); } log.info("Truck finished"); } public void lock() { lock.lock(); } public void unlock() { lock.unlock(); } public void await() { try { condition.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } public void signalAll() { condition.signalAll(); } private void travel(Warehouse warehouse) { log.info("Traveling to warehouse: {}", warehouse.getName()); try { Thread.sleep(travelTime); } catch (InterruptedException e) { log.error(e); } log.info("Arrived to warehouse: {}", warehouse.getName()); } }