Как заставить AtomicInteger работать в классе Runnable - PullRequest
0 голосов
/ 15 октября 2019

Я написал этот код как Runnable в Java, но мой профессор хочет, чтобы я добавил AtomicInteger, чтобы не было никакого вмешательства потока. Как мне это сделать? Я попытался найти примеры того, как использовать его в коде, но я не знаю, что делать в этом случае.

public class GarageWorker {
    public static void main(String[] args) {
        System.out.println("We are going to count the vehicles in the garage");
        System.out.println();
        System.out.println("There are 50 vehicles in the garage to start with!");
        System.out.println();

        GarageWorker garage = new GarageWorker(50);

        Runnable vehicleEnter = garage.new Enter();
        Runnable vehicleExit = garage.new Exit();

        Thread thread1 = new Thread(vehicleEnter);
        Thread thread2 = new Thread(vehicleExit);

        thread1.start();
        thread2.start();
    }

    public GarageWorker(int initialCarCount) {
        counter = initialCarCount;
    }

    public int counter;

    public class Enter implements Runnable {
        public Enter() {

        }

        public int increaseVehicleCount() {
            return ++counter;
        }

        public void run() {
            while (counter < 100) {
                System.out.println("One vehicle entered the garage now there are " + increaseVehicleCount());
            }
        }
    }

    public class Exit implements Runnable {
        public Exit() {

        }

        public int decreaseVehicleCount() {
            return --counter;
        }

        public void run() {
            while (counter > 0) {
                System.out.println("One vehicle left the garage now there are " + decreaseVehicleCount());
            }
        }
    }
}

Код работает нормально, но мой профессор хочет, чтобы я внедрил в код класс AtomicInteger.

1 Ответ

2 голосов
/ 15 октября 2019

Я предполагаю, что ваш профессор хочет, чтобы вы изменили counter на AtomicInteger. Сначала вы хотите импортировать AtomicInteger, а также изменить объявление counter и конструктор, отражающий это.

import java.util.concurrent.atomic.AtomicInteger;
public GarageWorker(int initialCarCount) {
    counter = new AtomicInteger(initialCarCount);
}

public AtomicInteger counter;

Также вы хотите изменить increaseVehicleCount и decreaseVehicleCount методы для использования AtomicInteger вместо int.

public int increaseVehicleCount() {
    return counter.incrementAndGet();
}
public int decreaseVehicleCount() {
    return counter.decrementAndGet();
}

incrementAndGet, а также decrementAndGet сделать простокак говорится: они увеличивают (или уменьшают) и впоследствии возвращают новое значение. Для получения дополнительной информации, посмотрите на Javadoc .

Приветствия!

...