Как закончить задачу многопоточного программирования - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующая задача:

"Порт. Суда входят в порт для выгрузки / загрузки контейнеров. Количество контейнеров, находящихся в настоящее время в порту и на судне, должно быть неотрицательным и превышать указанную вместимость.судна и вместимости порта. В порту имеется несколько причалов. Один причал может стоять на судне. Судно может загружаться у причала, разгружаться или выполнять обе операции. "

Нельзя использовать ключевое слово 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);
}
}

Кто-нибудь может помочь?Я просто в тупике)

...