У меня есть следующая задача:
"Порт. Суда входят в порт для выгрузки / загрузки контейнеров. Количество контейнеров, находящихся в настоящее время в порту и на судне, должно быть неотрицательным и превышать указанную вместимость.судна и вместимости порта. В порту имеется несколько причалов. Один причал может стоять на судне. Судно может загружаться у причала, разгружаться или выполнять обе операции. "
Нельзя использовать ключевое слово synchronized.
Я организовал поток кораблей.Сделано невозможным, чтобы количество контейнеров, в настоящее время находящихся на судне, было больше, чем грузоподъемность судна.Но я не могу понять, как это сделать: количество контейнеров в настоящее время в порту, которое должно быть неотрицательным и превышать указанную емкость порта.Я также не могу понять, как заставить корабль погрузиться на пирсе, разгрузить или выполнить обе операции?
Ship.java
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.ReentrantLock;
public class Ship extends Thread {
private static final boolean[] PARKING_PLACES = new boolean[5];
private static final Semaphore SEMAPHORE = new Semaphore(5, true);
private int idShip;
private int currentNumOfContains;
private int maxNumOfContains;
private ReentrantLock locker;
Ship(int idShip, int currentNumOfContains, int maxNumOfContains, ReentrantLock locker) {
this.idShip = idShip;
this.currentNumOfContains = currentNumOfContains;
this.maxNumOfContains = maxNumOfContains;
this.locker = locker;
}
@Override
public void run() {
if (currentNumOfContains <= maxNumOfContains) {
System.out.printf("Ship №%d sailed to the pier.\n", idShip);
try {
SEMAPHORE.acquire();
int parkingNumber = -1;
locker.lock();
try {
for (int i = 0; i < 5; i++)
if (!PARKING_PLACES[i]) {
PARKING_PLACES[i] = true;
parkingNumber = i;
System.out.printf("Ship №%d moored at berth %d.\n", idShip, i);
break;
}
} finally {
locker.unlock();
}
Thread.sleep(5000);
locker.lock();
try {
PARKING_PLACES[parkingNumber] = false;
} finally {
locker.unlock();
}
SEMAPHORE.release();
System.out.printf("Ship №%d left the pier.\n", idShip);
} catch (InterruptedException ignored) { }
} else System.out.printf("Ship №%d drowned due to overload.\n", idShip);
}
}
Port.java
public class Port {
private int countOfDock;
private int maxNumOfContainers;
private int currentNumOfContainers;
public Port(int countOfDock, int maxNumOfContainers, int currentNumOfContainers, boolean freePlace) {
this.countOfDock = countOfDock;
this.maxNumOfContainers = maxNumOfContainers;
this.currentNumOfContainers = currentNumOfContainers;
}
}
Main.java
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) throws InterruptedException {
ReentrantLock locker = new ReentrantLock();
new Ship(1, 90, 100, locker).start();
Thread.sleep(400);
new Ship(2, 190, 100, locker).start();
Thread.sleep(400);
new Ship(3, 1, 100, locker).start();
Thread.sleep(400);
new Ship(4, 48, 100, locker).start();
Thread.sleep(400);
new Ship(5, 200, 100, locker).start();
Thread.sleep(400);
}
}
Кто-нибудь может помочь?Я просто в тупике)